| 
					
				 | 
			
			
				@@ -0,0 +1,764 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode Protocol Specification Draft 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Version 0.8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(c)2009-2010 Adam Ierymenko 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Table of Contents 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+1. Introduction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode provides three components that work together to provide a global, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+secure, and mobile addressing system for computer networks: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+1) An addressing system based on public key cryptography enabling network 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   devices or applications to assign themselves secure, unique, and globally 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   reachable network addresses in a flat address space. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2) A system enabling network participants holding global addresses to locate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   one another on local or global networks with "zero configuration." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3) A communications protocol for communication between addressed network 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   participants that requires no special operating system support and no 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   changes to existing network infrastructure. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Using Anode, both fixed and mobile applications and devices can communicate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+directly as if they were all connected to the same VPN. Anode restores the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+original vision of the Internet as a "flat" network where anything can talk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to anything, and adds the added benefits of address mobility and strong 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protection against address spoofing and other protocol level attacks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+1.1. Design Philosophy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode's design philosophy is the classical "KISS" principle: "Keep It Simple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Stupid." Anode's design principles are: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#1: Do not try to solve too many problems at once, and stay in scope. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode does not attempt to solve too many problems at once. It attempts to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+solve the problems of mobile addressing, address portability, and "flat" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+addressing in the presence of NAT or other barriers. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+It does not attempt to duplicate the full functionality of SSL, X.509, SSH, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+XMPP, an enterprise service bus, a pub/sub architecture, BitTorrent, etc. All 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+of those protocols and services can be used over Anode if their functionality 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+is desired. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#2: Avoid state management. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+State multiplies the complexity and failure modes of network protocols. State 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+also tends to get in the way of the achievement of new features implicitly 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(see principle #4). Avoid state whenever possible. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#3: Avoid algorithm and dependency bloat. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode uses only elliptic curve Diffie-Hellman (EC-DH) and AES-256. No other 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cryptographic algorithms or hash functions are presently necessary. This 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+yields implementations compact enough for embedded devices. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode also requires few or no dependencies, depending on whether the two 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+needed cryptographic algorithms are obtained through a library or included. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+No other protocols or libraries are required in an implementation. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#4: Achieve features implicitly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Use a simple stateless design that allows features to be achieved implicitly 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+rather than specified explicitly. For example, Anode can do multi-homing and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+could be used to build a mesh network, but neither of these features is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+explicitly specified. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2. Core Concepts and Algorithms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+This section describes addresses, zones, common algorithms, and other core 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+concepts. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.1. Zones 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A zone is a 32-bit integer encoded into every Anode address. Zones serve to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+assist in the location of peers by address on global IP networks. They are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+not presently significant for local communications, though they could be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+used to partition addresses into groups or link them with configuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+options. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Each zone has a corresponding zone file which can be fetched in a number of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ways (see below). A zone file is a flat text format dictionary of the format 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+"key=value" separated by carriage returns. Line feeds are ignored, and any 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+character may be escaped with a backslash (\) character. Blank lines are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ignored. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The following entries must appear in a zone file: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+n=<zone name> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+d=<zone description> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+c=<zone contact, e-mail address of zone administrator> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+r=<zone revision, monotonically increasing integer with each edit> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ttl=<seconds before zone file should be re-checked for changes> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Additional fields may appear as well, including fields specific to special 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+applications or protocols supported within the zone. Some of these are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+defined in this document. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Zone file fetching mechanisms are described below. Multiple mechanisms are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+specified to enable fallback in the event that one mechanism is not available. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.1.1. Zone File Retrieval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Zone files are retrieved via HTTP, with the HTTP address being formed in one 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+of two ways. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The preferred DNS method: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To fetch a zone file via DNS, use the zone ID to generate a host name and URI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+of the form: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  http://a--XXXXXXXX.net/z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The XXXXXXXX field is the zone ID in hexadecimal. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The fallback IP method: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+For fallback in the absence of DNS, the zone ID can be used directly as an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+IPv4 or IPv4-mapped-to-IPv6 IP address. A URI is generated of the form: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  http://ip_address/z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Support for this method requires that a zone ID be chosen to correspond to a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+permanent IPv4 (preferably mappable to IPv6 space as well) IP address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.1.2. Zone ID Reservation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+By convention, a zone ID is considered reserved when a domain of the form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+"a--XXXXXXXX.net" (where XXXXXXXX is the ID in hex) is registered. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+It is recommended that this be done even for zone IDs not used for global 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+address location in order to globally reserve them. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.2. Addresses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode addresses are binary strings containing a 32-bit zone ID, a public key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and possibly other fields. Only one address type is presently defined: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Name         | Type ID | Elliptic Curve Parameters         | Total Length | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| ANODE-256-40 | 1       | NIST-P-256                        | 40           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Name         | Binary Layout                                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| ANODE-256-40 | <type[1]><zone[4]><unused[2]><public key[33]>              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The public key is a "compressed" form elliptic curve public key as described 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+in RFC5480. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The unused section of the address must be zero. These bytes are reserved for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+future use. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.2.1. ASCII Format For Addresses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Addresses are encoded in ASCII using base-32, which provides a quotable and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+printable encoding that is of manageable length and is case-insensitive. For 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+example, an ANODE-256-40 address is 64 characters long in base-32 encoding. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.3. Relaying 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+An Anode peer may optionally relay packets to any other reachable peer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Relaying is accomplished by sending a packet to a peer with the recipient set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to the final recipient. The receiving peer will, if relaying is allowed and if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+it knows of or can reach the recipient, forward the packet. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+No error is returned if relaying fails, so relay paths are treated as possible 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+paths for communication until a return is received in the same way as direct 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+paths. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Relaying can be used by peers to send messages indirectly, locate one 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+another, and determine network location information to facilitate the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+establishment of direct communications. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Peers may refuse to relay or may limit the transmission rate at which packets 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+can be relayed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.3.1. Zone Relays 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If a zone's addresses are globally reachable on global IP networks, it must 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+have one or more zone relays. These must have globally reachable public 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static IP addresses. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Zone relays are specified in the zone file in the following format: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zr.<address checksum>=<ip>[,<ip>]:<udp port>:<tcp port>:<anode addresses> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The address checksum is the sum of the bytes in the Anode address modulus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the number of "zr" entries, in hexadecimal. For example, if a zone had four 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+global relays its zone file could contain the lines: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zr.0=1.2.3.4:4343:4344:klj4j3... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zr.1=2.3.4.5:4343:4344:00194j... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zr.2=3.4.5.6:4343:4344:1j42zz... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zr.3=4.5.6.7:4343:4344:z94j1q... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The relay would be chosen by taking the sum of the bytes in the address 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+modulo 4. For example, if the bytes of an address sum to 5081 then relay 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+zr.1 would be used to communicate with that address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If more than one IP address is listed for a given relay, the peer must choose 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+at random from among the addresses of the desired type (IPv4 or IPv6). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Each relay must have one Anode address for every address type supported within 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the zone. (At present there is only one address type defined.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Peers should prefer UDP and fall back to TCP only if UDP is not available. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To make itself available, a peer must make itself known to its designated zone 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+relay. This is accomplished by sending a PING message. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.4. Key Agreement and Derivation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Key agreement is performed using elliptic curve Diffie-Hellman. This yields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+a raw key whose size depends on the elliptic curve parameters in use. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The following algorithm is used to derive a key of any length from a raw 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+key generated through key agreement: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+1) Zero the derived key buffer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2) Determine the largest of the original raw key or the derived key. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3) Loop from 0 to the largest length determined in step 2, XOR each byte of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   the derived key buffer with the corresponding byte of the original key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   buffer with each index being modulus the length of the respective buffer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.5. Message Authentication 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+For message authentication, CMAC-AES (with AES-256) is used. This is also 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+known in some literature as OMAC1-AES. The key is derived from key agreement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+between the key pair of the sending peer and the address of the recipient. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.6. AES-DIGEST 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To maintain cryptographic algorithm frugality, a cryptographic hash function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+is constructed from the AES-256 cipher. This hash function uses the common 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Davis-Meyer construction with Merkle-Damgård length padding. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+It is described by the following pseudocode: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  byte previous_digest[16]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  byte digest[16] = { 0,0,... }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  byte block[32] = { 0,0,... }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  integer block_counter = 0  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ; digest message  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for each byte b of message  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    block[block_counter] = b  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    block_counter = block_counter + 1  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if block_counter == 32 then  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      block_counter = 0  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      save digest[] in previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      encrypt digest[] with aes-256 using block[] as 256-bit aes-256 key  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      xor digest[] with previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    end if  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  next  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ; append end marker, do final block  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  block[block_counter] = 0x80  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  block_counter = block_counter + 1  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zero rest of block[] from block_counter to 15  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  save digest[] in previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  encrypt digest[] with aes-256 using block[] as 256-bit aes-256 key  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  xor digest[] with previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ; Merkle-Damgård length padding  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  zero first 8 bytes of block[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  fill last 8 bytes of block[] w/64-bit length in big-endian order  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  save digest[] in previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  encrypt digest[] with aes-256 using block[] as 256-bit aes-128 key  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  xor digest[] with previous_digest[]  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ; digest[] now contains 128-bit message digest  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.7. Short Address Identifiers (Address IDs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A short 8-byte version of the Anode address is used in the protocol to reduce 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+transmission overhead when both sides are already aware of the other's full 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The short address identifier is formed by computing the AES-DIGEST of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+full address and then XORing the first 8 bytes of the digest with the last 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+8 bytes to yield an 8-byte shortened digest. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.8. DNS Resolution of Anode Addresses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode addresses can be saved in DNS TXT records in the following format: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+anode:<address in base32 ASCII encoding> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+This permits Anode addresses to be resolved from normal DNS host name. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.9. Packet Transmission Mechanisms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.9.1. UDP Transmission 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The recommended method of sending Anode packets is UDP. Each packet is simply 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sent as a UDP packet. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.9.2. TCP Transmission 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To send packets over TCP, each packet is prefixed by its size as a 16-bit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+integer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.9.3. HTTP Transmission 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode packets may be submitted in HTTP POST transactions for transport over 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+networks where HTTP is the only available protocol. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode packets are simply prefixed with a 16-byte packet size and concatenated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+together just as they are in a TCP stream. One or more packets may be sent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+with each HTTP POST transaction for improved performance. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Since this method is intended for use in "hostile" or highly restricted 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+circumstances, no additional details such as special headers or MIME types 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+are specified to allow maximum flexibility. Peers should ignore anything 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+other than the payload. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.10. Endpoints 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+An endpoint indicates a place where Anode packets may be sent. The following 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endpoint types are specified: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Endpoint Type | Description   | Address Format                            | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x00          | Unspecified   | (none)                                    | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x01          | Ethernet      | <mac[6]>                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x02          | UDP/IPv4      | <ip[4]><port[2]>                          | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x03          | TCP/IPv4      | <ip[4]><port[2]>                          | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x04          | UDP/IPv6      | <ip[16]><port[2]>                         | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x05          | TCP/IPv6      | <ip[16]><port[2]>                         | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x06          | HTTP          | <null-terminated full URI>                | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Endpoints are encoded by beginning with a single byte indicating the endpoint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type followed by the address information required for the given type. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Note that IP ports bear no relationship to Anode protocol ports. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2.11. Notes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+All integers in the protocol are transmitted in network (big endian) byte 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+order. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3. Common Packet Format 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A common header is used for all Anode packets: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field                    | Length | Description                           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Hop Count                | 1      | 8-bit hop count (not included in MAC) | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Flags                    | 1      | 8-bit flags                           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| MAC                      | 8      | 8 byte shortened CMAC-AES of packet   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Address           | ?      | Full address or short ID of sender    | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Recipient Address        | ?      | Full address or short ID of recipient | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Peer IDs                 | 1      | Two 4-bit peer IDs: sender, recipient | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Message Type             | 1      | 8-bit message type                    | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Message                  | ?      | Message payload                       | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3.1. Hop Count 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The hop count begins at zero and must be incremented by each peer that relays 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the packet to another peer. The hop count must not wrap to zero at 255. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Because the hop count is modified in transit, it is not included in MAC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+calculation or authentication. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The hop count is used to prioritize endpoints that are direct over endpoints 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+that involve relaying, or to prioritize closer routes over more distant 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ones. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3.2. Flags and Flag Behavior 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Flag  | Description                                                       | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x01  | Sender address fully specified                                    | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x02  | Recipient address fully specified                                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x04  | Authentication error response                                     | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If flag 0x01 is set, then the sender address will be the full address rather 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+than a short address identifier. The length of the address can be determined 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from the first byte of the address, which always specifies the address type. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Flag 0x02 has the same meaning for the recipient address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A peer must send fully specified sender addresses until it receives a response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from the recipient. At this point the sender may assume that the recipient 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+knows its address and use short a short sender address instead. This 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+assumption should time out, with a recommended timeout of 60 seconds. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+There is presently no need to send fully specified recipient addresses, but 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the flag is present in case it is needed and must be honored. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Flag 0x04 indicates that this is an error response containing a failed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+authentication error. Since authentication failed, this packet may not have 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+a valid MAC. Packets with this flag must never have any effect other than 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to inform of an error. This error, since it is unauthenticated, must never 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+have any side effects such as terminating a connection. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3.3. MAC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The MAC is calculated as follows: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+1) Temporarily set the 64-bit/8-byte MAC field in the packet to the packet's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   size as a 64-bit big-endian integer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+2) Calculate the MAC for the entire packet (excluding the first byte) using 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   the key agreed upon between the sender and the recipient, resulting in a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   16 byte full CMAC-AES MAC. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3) Derive the 8 byte packet MAC by XORing the first 8 bytes of the full 16 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   byte CMAC-AES MAC with the last 8 bytes. Place this into the packet's MAC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   field. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3.4. Peer IDs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Peer IDs provide a method for up to 15 different peers to share an address, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+each with a unique ID allowing packets to be routed to them individually. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A peer ID of zero indicates "any" or "unspecified." Real peers must have a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+nonzero peer ID. In the normal single peer per address case, any peer ID may 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+be used. If multiple peers are to share an address, some implementation- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dependent method must be used to ensure that each peer has a unique peer ID. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Relaying peers must follow these rules based on the recipient peer ID when 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+relaying messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ - IF the peer ID is zero or if the peer ID is not known, the message must 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   be forwarded to a random endpoint for the given recipient address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ - IF the peer ID is nonzero and matches one or more known endpoints for the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   given recipient address and peer ID, the message must only be sent to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   a matching endpoint. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A receiving peer should process any message that it receives regardless of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+whether its recipient peer ID is correct. The peer ID is primarily for relays. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Peers should typically send messages with a nonzero recipient peer ID when 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+responding to or involved in a conversation with a specific peer (e.g. a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+streaming connection), and send zero recipient peer IDs otherwise. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+3.5. Short Address Conflict Disambiguation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+In the unlikely event of two Anode addresses with the same short identifier, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the recipient should use MAC validation to disambiguate. The peer ID must not 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+be relied upon for this purpose. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4. Basic Signaling and Transport Protocol 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.1. Message Types 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Type        | ID   | Description                                          | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| ERROR       | 0x00 | Error response                                       | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| PING        | 0x01 | Echo request                                         | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| PONG        | 0x02 | Echo response                                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| EPC_REQ     | 0x03 | Endpoint check request                               | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| EPC         | 0x04 | Endpoint check response                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| EPI         | 0x05 | Endpoint information                                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NAT_T       | 0x06 | NAT traversal message                                | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NETID_REQ   | 0x07 | Request network address identification and/or test   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NETID       | 0x08 | Response to network address identification request   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| DGRAM       | 0x09 | Simple UDP-like datagram                             | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2. Message Details 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.1. ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Error Code        | 2      | 16-bit error code                            | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Error Arguments   | ?      | Error arguments, depending on error type     | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Error arguments are empty unless otherwise stated below. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Error codes: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Error Code | Description                                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x01       | Message not valid                                            | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x02       | Message authentication or decryption failed                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x03       | Relaying and related features not authorized                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 0x04       | Relay recipient not reachable                                | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Generation of errors is optional. A peer may choose to ignore invalid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messages or to throttle the sending of errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.2. PING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(Payload unspecified.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Request echo of payload as PONG message. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.3. PONG 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(Payload unspecified.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Echoed payload of received PING message. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.4. EPC_REQ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Request ID        | 4      | 32-bit request ID                            | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Request echo of request ID in EPC message, used to check and learn endpoints. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To learn a network endpoint for a peer, CHECK_REQ is sent. If CHECK is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+returned with a valid request ID, the endpoint is considered valid. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.5. EPC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Request ID        | 4      | 32-bit request ID echoed back                | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Response to EPC_REQ containing request ID. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.6. EPI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Flags             | 1      | 8-bit flags                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Endpoint          | ?      | Endpoint type and address                    | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NAT-T mode        | 1      | 8-bit NAT traversal mode                     | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NAT-T options     | ?      | Options related to specified NAT-T mode      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EPI stands for EndPoint Identification, and is sent to notify another peer of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+a network endpoint where the sending peer is reachable. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If the receiving peer is interested in communicating with the sending peer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the receiving peer must send EPC_REQ to the sending peer at the specified 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endpoint to check the validity of that endpoint. The endpoint is learned if a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+valid EPC is returned. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If the endpoint in EPI is unspecified, the actual source of the EPI message 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+is the endpoint. This allows EPI messages to be broadcast on a local LAN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+segment to advertise the presence of an address on a local network. EPI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+broadcasts on local IP networks must be made to UDP port 8737. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Usually EPI is sent via relays (usually zone relays) to inform a peer of an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endpoint for direct communication. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+There are presently no flags, so flags must be zero. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.7. NAT_T 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NAT-T mode        | 1      | 8-bit NAT traversal mode                     | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| NAT-T options     | ?      | Options related to specified NAT-T mode      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+NAT_T is used to send messages specific to certain NAT traversal modes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.8. NETID_REQ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Request ID        | 4      | 32-bit request ID                            | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Endpoint          | ?      | Endpoint type and address information        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+When a NETID_REQ message is received, the recipient attempts to echo it back 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+as a NETID message to the specified endpoint address. If the endpoint is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unspecified, the recipient must fill it in with the actual origin of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+NETID_REQ message. This allows a peer to cooperate with another peer (usually 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+a zone relay) to empirically determine its externally visible network 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+address information. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A peer may ignore NETID_REQ or respond with an error if it does not allow 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+relaying. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.9. NETID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Request ID        | 4      | 32-bit request ID echoed back                | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Endpoint Type     | 1      | 8-bit endpoint type                          | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Endpoint Address  | ?      | Endpoint Address (size depends on type)      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+NETID is sent in response to NETID_REQ to the specified endpoint address. It 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+always contains the endpoint address to which it was sent. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.2.10. DGRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Source Port       | 2      | 16-bit source port                           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Payload           | ?      | Datagram packet payload                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+A datagram is a UDP-like message without flow control or delivery assurance. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+***************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5. Stream Protocol 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The stream protocol is very similar to TCP, though it omits some features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+that are not required since they are taken care of by the encapsulating 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protocol. SCTP was also an inspiration in the design. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.1. Message Types 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Type      | ID | Description                                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| S_OPEN    | 20 | Initiate a streaming connection (like TCP SYN)           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| S_CLOSE   | 21 | Terminate a streaming connection (like TCP RST/FIN)      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| S_DATA    | 22 | Data packet                                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| S_ACK     | 23 | Acknowedge receipt of one or more data packets           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| S_DACK    | 24 | Combination of DATA and ACK                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2. Message Details 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2.1. S_OPEN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Link ID    | 2      | 16-bit sender link ID                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Window Size       | 2      | 16-bit window size in 1024-byte increments   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Init. Seq. Number | 4      | 32-bit initial sequence number               | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Flags             | 1      | 8-bit flags                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The OPEN message corresponds to TCP SYN, and initiates a connection. It 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+specifies the initial window size for the sender and the sender's initial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sequence number, which should be randomly chosen to prevent replay attacks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If OPEN is successful, the recipient sends its own OPEN to establish the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connetion. If OPEN is unsuccessful, CLOSE is sent with its initial and current 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sequence numbers equal and an appropriate reason such as "connection refused." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The sender link ID must be unique for a given recipient. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If flag 01 is set, the sender link ID is actually a source port where the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sender might be listening for connections as well. This exactly duplicates 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the behavior of standard TCP. Otherwise, the sender link ID is simply an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+arbitrary number that the sender uses to identify the connection with this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+recipient and there is no port of origin. Ports of origin are optional for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Anode streaming connections to permit greater scalability. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2.2. S_CLOSE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Link ID    | 2      | 16-bit sender link ID                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Flags             | 1      | 8-bit flags                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Reason            | 1      | 8-bit close reason                           | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Init. Seq. Number | 4      | 32-bit initial sequence number               | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sequence Number   | 4      | 32-bit current sequence number               | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The CLOSE message serves a function similar to TCP FIN. The initial sequence 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+number is the original starting sequence number sent with S_OPEN, while the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+current sequence number is the sequence number corresponding to the close 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and must be ACKed to complete the close operation. The use of the initial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sequence number helps to serve as a key to prevent replay attacks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CLOSE is also used to indicate a failed OPEN attempt. In this case the current 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sequence number will be equal to the initial sequence number and no ACK will 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+be expected. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+There are currently no flags, so flags must be zero. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The reason field describes the reason for the close: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Reason Code | Description                                                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 00          | Application closed connection                               | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 01          | Connection refused                                          | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 02          | Protocol error                                              | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| 03          | Timed out                                                   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Established connections will usually be closed with reason 00, while reason 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+01 is usually provided if an OPEN is received but the port is not bound. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2.3. S_DATA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Link ID    | 2      | 16-bit sender link ID                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sequence Number   | 4      | 32-bit sequence number                       | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Payload           | ?      | Data payload                                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The DATA message carries a packet of data, with the sequence number 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+determining order. The sequence number is monotonically incremented with 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+each data packet, and wraps at the maximum value of an unsigned 32-bit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+integer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2.4. S_ACK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Link ID    | 2      | 16-bit sender link ID                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Window Size       | 2      | 16-bit window size in 1024-byte increments   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Acknowledgements  | ?      | One or more acknowledgements (see below)     | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Each acknowledgement is a 32-bit integer followed by an 8-bit integer (5 bytes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+total). The 32-bit integer is the first sequence number to acknowledge, and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the 8-bit integer is the number of sequential following sequence numbers to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+acknowledge. For example "1, 4" would acknowledge sequence numbers 1, 2, 3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and 4. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+5.2.5. S_DACK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Field             | Length | Description                                  | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Sender Link ID    | 2      | 16-bit sender link ID                        | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Destination Port  | 2      | 16-bit destination port                      | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Window Size       | 2      | 16-bit window size in 1024-byte increments   | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Num. Acks         | 1      | 8-bit number of acknowledgements             | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Acknowledgements  | ?      | One or more acknowledgements                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+| Payload           | ?      | Data payload                                 | 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+|---------------------------------------------------------------------------| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The DACK message combines ACK and DATA, allowing two peers that are both 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+transmitting data to efficiently ACK without a separate packet. 
			 |