123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765 |
- *****************************************************************************
- 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.
|