One document matched: draft-baset-p2psip-p2pp-00.txt
Network Working Group S. Baset
Internet-Draft H. Schulzrinne
Intended status: Standards Track Columbia University
Expires: January 3, 2008 July 2, 2007
Peer-to-Peer Protocol (P2PP)
draft-baset-p2psip-p2pp-00
Status of this Memo
By submitting this Internet-Draft, each author represents that any
applicable patent or other IPR claims of which he or she is aware
have been or will be disclosed, and any of which he or she becomes
aware will be disclosed, in accordance with Section 6 of BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as Internet-
Drafts.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt.
The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.
This Internet-Draft will expire on January 3, 2008.
Copyright Notice
Copyright (C) The IETF Trust (2007).
Baset & Schulzrinne Expires January 3, 2008 [Page 1]
Internet-Draft Peer-to-Peer Protocol July 2007
Abstract
This document defines the Peer-to-Peer Protocol (P2PP), an
application-layer protocol, for creating and maintaining an overlay
of participant nodes. The overlay can be created using various
structured and unstructured peer-to-peer protocols such as Chord,
Pastry, Kademlia, Gnutella, and Gia.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Overview of P2PP Functionality . . . . . . . . . . . . . . . . 6
3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 7
4. Design Overview . . . . . . . . . . . . . . . . . . . . . . . 9
4.1. Overall Design Approach . . . . . . . . . . . . . . . . . 9
4.2. P2PP Interface, Messages, and API . . . . . . . . . . . . 10
4.3. P2PP and SIP . . . . . . . . . . . . . . . . . . . . . . . 12
4.4. Request Routing . . . . . . . . . . . . . . . . . . . . . 12
4.5. Transport . . . . . . . . . . . . . . . . . . . . . . . . 12
4.5.1. Listening Ports . . . . . . . . . . . . . . . . . . . 14
4.6. NAT and Firewall Traversal . . . . . . . . . . . . . . . . 14
4.7. Node Capabilities . . . . . . . . . . . . . . . . . . . . 14
5. P2PP Processing Overview . . . . . . . . . . . . . . . . . . . 15
5.1. Node State . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2. Request Generation and Response Processing . . . . . . . . 16
5.2.1. Issues in Recursive Routing . . . . . . . . . . . . . 16
5.2.2. Issues in Iterative Routing . . . . . . . . . . . . . 17
5.3. Request Processing and Response Generation . . . . . . . . 17
5.4. Message State Machine . . . . . . . . . . . . . . . . . . 19
5.4.1. Request State Machine . . . . . . . . . . . . . . . . 19
5.4.2. Response State Machine . . . . . . . . . . . . . . . . 21
5.5. Resource-object . . . . . . . . . . . . . . . . . . . . . 21
5.6. Routing-table Maintenance . . . . . . . . . . . . . . . . 22
5.7. Timers . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6. Message Formats . . . . . . . . . . . . . . . . . . . . . . . 23
6.1. Join . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2. Leave . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.3. Keep-alive . . . . . . . . . . . . . . . . . . . . . . . . 26
6.4. LookupPeer . . . . . . . . . . . . . . . . . . . . . . . . 26
6.5. ExchangeTable . . . . . . . . . . . . . . . . . . . . . . 27
6.6. Query . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.7. Replicate . . . . . . . . . . . . . . . . . . . . . . . . 28
6.8. Transfer . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.9. Publish (put) . . . . . . . . . . . . . . . . . . . . . . 28
6.10. LookupObject (get) . . . . . . . . . . . . . . . . . . . . 29
6.11. RemoveObject . . . . . . . . . . . . . . . . . . . . . . . 30
7. Bit-Level Formats and Errors . . . . . . . . . . . . . . . . . 31
Baset & Schulzrinne Expires January 3, 2008 [Page 2]
Internet-Draft Peer-to-Peer Protocol July 2007
7.1. Common Header . . . . . . . . . . . . . . . . . . . . . . 31
7.2. General Object Format . . . . . . . . . . . . . . . . . . 32
7.3. P2PP TLV Objects . . . . . . . . . . . . . . . . . . . . . 33
7.3.1. Peer-Info . . . . . . . . . . . . . . . . . . . . . . 33
7.3.2. Request-Options . . . . . . . . . . . . . . . . . . . 35
7.3.3. P2P-Options . . . . . . . . . . . . . . . . . . . . . 36
7.3.4. Routing-Table . . . . . . . . . . . . . . . . . . . . 36
7.3.5. Neighbor-table . . . . . . . . . . . . . . . . . . . . 37
7.3.6. PLookup . . . . . . . . . . . . . . . . . . . . . . . 37
7.3.7. Resource-Object . . . . . . . . . . . . . . . . . . . 38
7.3.8. Expires . . . . . . . . . . . . . . . . . . . . . . . 39
7.3.9. Owner . . . . . . . . . . . . . . . . . . . . . . . . 39
7.3.10. Credentials . . . . . . . . . . . . . . . . . . . . . 39
7.4. Errors . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7.4.1. Error Object . . . . . . . . . . . . . . . . . . . . . 40
7.4.2. Response Codes . . . . . . . . . . . . . . . . . . . . 40
8. API between P2PP and Applications . . . . . . . . . . . . . . 42
8.1. Query . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2. Join . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.3. Leave . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.4. Publish . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.5. Remove . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.6. Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 43
9. Security Considerations . . . . . . . . . . . . . . . . . . . 44
10. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 45
11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 46
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47
13. Change Log . . . . . . . . . . . . . . . . . . . . . . . . . . 50
14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 51
14.1. Normative References . . . . . . . . . . . . . . . . . . . 51
14.2. Informative References . . . . . . . . . . . . . . . . . . 51
Appendix A. Background . . . . . . . . . . . . . . . . . . . . . 54
A.1. Structured Overlays . . . . . . . . . . . . . . . . . . . 54
A.1.1. Chord . . . . . . . . . . . . . . . . . . . . . . . . 54
A.1.2. Pastry . . . . . . . . . . . . . . . . . . . . . . . . 55
A.1.3. Kademlia . . . . . . . . . . . . . . . . . . . . . . . 56
A.1.4. Bamboo/OpenDHT . . . . . . . . . . . . . . . . . . . . 56
A.2. DHT Commonalities . . . . . . . . . . . . . . . . . . . . 57
A.3. Unstructured Overlays . . . . . . . . . . . . . . . . . . 58
A.3.1. Gia . . . . . . . . . . . . . . . . . . . . . . . . . 58
Appendix B. Protocol design choices . . . . . . . . . . . . . . . 60
B.1. To SIP or not to SIP . . . . . . . . . . . . . . . . . . . 60
B.2. To ASCII or not to ASCII . . . . . . . . . . . . . . . . . 60
Appendix C. Examples . . . . . . . . . . . . . . . . . . . . . . 62
C.1. Join (Pastry) . . . . . . . . . . . . . . . . . . . . . . 62
C.2. Join (Gia) . . . . . . . . . . . . . . . . . . . . . . . . 65
C.3. Join (Chord) . . . . . . . . . . . . . . . . . . . . . . . 66
C.4. Lookup (Pastry) . . . . . . . . . . . . . . . . . . . . . 66
Baset & Schulzrinne Expires January 3, 2008 [Page 3]
Internet-Draft Peer-to-Peer Protocol July 2007
C.5. Lookup (Gia) . . . . . . . . . . . . . . . . . . . . . . . 67
C.6. Lookup (Chord) . . . . . . . . . . . . . . . . . . . . . . 67
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 68
Intellectual Property and Copyright Statements . . . . . . . . . . 69
Baset & Schulzrinne Expires January 3, 2008 [Page 4]
Internet-Draft Peer-to-Peer Protocol July 2007
1. Introduction
This document defines Peer-to-Peer Protocol (P2PP) for creating and
maintaining an overlay of participant nodes. P2PP also allows non-
participant nodes to use overlay services through participant nodes.
The design of P2PP exploits commonalities in the peer-to-peer (p2p)
protocols such as Chord [12], CAN [13], Pastry [14], Kademlia [15],
and Gia [19] thereby defining a protocol that does not contain any
peer-to-peer protocol specific details and has an extension mechanism
to incorporate a protocol-specific feature. Though general in scope,
the specification does not claim that P2PP can be used to implement
any peer-to-peer protocol.
Baset & Schulzrinne Expires January 3, 2008 [Page 5]
Internet-Draft Peer-to-Peer Protocol July 2007
2. Overview of P2PP Functionality
P2PP is an application-layer protocol that can be used to form and
maintain an overlay of participant nodes. It provides mechanisms for
nodes to join and leave the overlay, and publish or search for a
resource-object in the overlay. A common aspect of these mechanisms
is to find an appropriate node in the overlay. A node can find an
appropriate node by maintaining tables of other nodes, called routing
and neighbor table. Since, an overlay can comprise a large number of
nodes, these tables only contains a subset of these nodes.
P2PP is a request-response protocol. For every request received, a
node checks if it can accomplish the request. If it cannot complete
the request, it sends the message to node(s) which is(are) most
likely to accomplish the request. A node determines the destination
of the request from its routing-table or neighbor-table by performing
a local nextHop() operation. This method of message forwarding is
known as recursive-routing. The routing methods are explained in
Section 4.4.
It is important to note that a node determines the next hop for a
message solely from its routing table; it does not consult any other
nodes. Different peer-to-peer protocols have different mechanisms
for determining the next hop for a request; however this is done on a
per-node basis. This aspect keeps the design of P2PP independent of
any existing peer-to-peer protocols.
Baset & Schulzrinne Expires January 3, 2008 [Page 6]
Internet-Draft Peer-to-Peer Protocol July 2007
3. Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [1].
Some of the terminology has been borrowed from the P2P terminology
draft [8].
Node A node is an entity that runs an overlay protocol (peer) or can
access the services provided by an overlay network (client).
Overlay Peer (or Peer): A peer is a node participating in a P2PSIP
overlay that provides storage and routing services to other nodes
in the overlay and is capable of performing operations such as
join, leave, and routing requests within the overlay [8].
Client: A client is a node participating in a P2PSIP overlay that
provides neither routing nor storage and retrieval functions [8].
Peer-ID (or Peer Key): A Peer-ID is an information that uniquely
identifies a peer within a given P2PSIP overlay [8]. In DHT-based
overlays, this is a hash of the unique node identifier such as an
IP address. In unstructured overlays, this is an unhashed unique
identifier.
Identifier (ID or Key): An identifier is an information that
uniquely identifies a resource-object, a node, or a service.
Peer-ID is a form of identifier. We use the term identifier (ID)
and key interchangeably.
Routing Table: A routing table (finger table in Chord) is used by a
peer to locate a peer that either has a resource-object or offers
a certain service such as routing or NAT traversal. In a DHT-
based overlay, a peer's routing table contains a list of overlay
peer-IDs and their IP addresses stored against identifiers that
are exponentially away from the peer's identifier and thus has a
particular structure. Nodes in unstructured networks also
maintain a routing table. This specification does not put an
upper limit on the number of entries a node can store in its
routing table.
Note that the distinction between neighbor and routing table is an
artifact of structured peer-to-peer networks.
Baset & Schulzrinne Expires January 3, 2008 [Page 7]
Internet-Draft Peer-to-Peer Protocol July 2007
Routing Peers: The list of peers stored in a routing table are
called routing peers.
Neighbor Table: In a DHT-based overlay, a node's neighbor table
(successor list in Chord, leaf-set in Pastry) contains a list of
peers which are 'immediately' close to the node's identifier. The
purpose of the neighbor table is to maintain correctness. In an
unstructured overlay, nodes only maintain a routing table.
Resource-object: A resource-object is a blob of data stored in
P2PSIP overlay and is identified by a resource-ID. Examples of
resource-objects are SIP URIs, routing-records, file-names, and
service identifiers. Each resource-object has meta-data
associated with it such as content-type, content-usage, owner and
expiration-time. The meta-data can also be user defined.
Service: A node can offer services such as NAT and firewall
traversal, and relaying traffic for other nodes. A node
advertises its service capabilities in the overlay using a
resource-object. Different nodes can advertise the same service.
Hetrogeneous Network Environments: An hetrogeneous network
environment comprises of nodes that use different mechanisms for
network connectivity such as dialup, DSL, or broadband.
Overlay Implementer: An entity that uses P2PP to implement an
overlay.
Baset & Schulzrinne Expires January 3, 2008 [Page 8]
Internet-Draft Peer-to-Peer Protocol July 2007
4. Design Overview
4.1. Overall Design Approach
There are three high-level requirements for a peer-to-peer protocol.
P2P network maintenance: The protocol should provide mechanisms to
maintain connectivity and resource availability in a peer-to-peer
network.
Resource publishing and lookup: The protocol should provide a
mechanism for a peer to publish a resource-object or advertise its
service and a mechanism to lookup the resource-object and the node
offering a service.
Heterogenous connectivity: Nodes should be able to form an overlay
in heterogeneous network environments and exchange information
about their uptime and capacity.
P2PP allows nodes to form a structured or an unstructured overlay.
Nodes that participate in the routing and overlay maintenance
decisions are called peers (super-nodes in conventional P2P
terminology). Nodes that do not participate in an overlay are called
clients (ordinary-nodes in conventional P2P terminology). Clients
can use overlay services through peers. Multiple clients can
participate in the overlay through one peer but clients can also
communicate with multiple peers at the same time. Client and peers
communicate using the same protocol as peers do, i.e., there is no
distinct protocol for client-to-peer and peer-to-peer communication.
P2PP is a request-response protocol. Peers or clients can issue
requests which other peers can respond. The transmission of requests
and responses is governed by state machine described in Section 5.4.
The requests can be forwarded in a recursive or an iterative manner
as described in Section 4.4. The requests can also be forwarded in a
sequential or parallel manner.
The process to discover a peer already in the overlay is outside the
scope of this specification. Several techniques such as multicast,
cache of nodes during last connection, or an appropriate rendezvous
mechanism can be used [21] Once a node already in the overlay has
been discovered, a peer may be admitted into an overlay. The
specification does not specify the conditions under which a peer may
or may not be admitted into the overlay and leaves policy decisions
such as admission control to the implementers of an overlay. This
gives P2PP its desired flexibility.
The protocol allows nodes to exchange uptime, CPU and bandwidth
Baset & Schulzrinne Expires January 3, 2008 [Page 9]
Internet-Draft Peer-to-Peer Protocol July 2007
utilization, network bandwidth, and network connectivity information
with other nodes. Nodes can use this information to intelligently
construct their routing tables. However, P2PP does not mandate the
exchange of this information. (Open Issue: The meaning of these
terms needs to be precisely defined.)
The protocol can be used in different network environments. In an
Internet deployment, peers can have heterogeneous connectivity. An
overlay designer may configure a policy such that only peers with a
public IP address can participate in the overlay. In a corporate
deployment, most or all nodes, which participate in the overlay, may
be behind NATs or firewalls. As mentioned earlier, the protocol does
not enforce any restriction on which nodes may participate in the
overlay and leaves this decision to the overlay implementer. (Open
Issue: we will need a BCP draft for Internet and corporate
deployment.)
P2PP exposes an API which allows applications to use overlay
services.
4.2. P2PP Interface, Messages, and API
In P2PP:
An interface is an abstraction which groups together messages that
perform related functions.
API provides a mechanism for an application to use overlay services.
An API call can be accomplished using one or more P2PP messages.
A message is a P2PP protocol message that performs a certain
function.
This specification defines three interfaces for the P2PP protocol
namely:
o Service interface
o Data or resource interface
o Diagnostic interface
Baset & Schulzrinne Expires January 3, 2008 [Page 10]
Internet-Draft Peer-to-Peer Protocol July 2007
^
|
P2PP
Application +------------+ +-----------+
Level |SIP Proxy/UA| |Application|
| +------------+ +-----------+
V | |
================|=================|========= P2PP API
| |
^ +----------------------------------------+
| | P2PP: -service +-------------+|
| | -data | Node State ||
| | -diagnostic | Maintenance ||
| | +-------------+|
| +----------------------------------------+
| | | |
| ..........................................
P2PP . Transport Layer Security (TLS or DTLS) .
Transport ..........................................
Level | |
| +-----+ +-----+
| | UDP | | TCP | ... other
| +-----+ +-----+ protocols
| | |
| .............................
| . IP Layer Security .
| .............................
V | | |
=================================|========|========|=============
| | |
+------------------------------------+
| IP |
+------------------------------------+
Figure 1: Protocol stack architecture for P2PP
The service interface defines operations for node join, leave,
routing-table maintenance and replication. The data interface
defines operations for data (resource) insertion, lookup, and
removal. The diagnostic interface defines operations for gathering
peer statistics such as response time and relay bandwidth.
The implementer of a peer-to-peer service may be interested in
gathering various statistics such as response time and peer
bandwidth. The diagnostic interface defines operations for gathering
these statistics. (Open Issue: Note that some of these statistics
can also be gathered using functions defined in the maintenance
interface. Thus, it is currently not entirely clear whether
Baset & Schulzrinne Expires January 3, 2008 [Page 11]
Internet-Draft Peer-to-Peer Protocol July 2007
diagnostics should be considered as a separate interface or whether
its operations be included in the maintenance interface.)
P2PP messages begin with a header followed by a sequence of type-
length-value (TLV) objects. Each message is either a request or a
response. The response header is the same as a request header except
that it contains a response code. P2PP messages cannot be combined
in one message if an unreliable transport is used.
4.3. P2PP and SIP
SIP [2] is an application-layer protocol that can establish, modify,
and terminate multimedia sessions. SIP nodes can either send
requests to other SIP nodes directly or through a SIP proxy. A SIP
node (user-agent or proxy) typically uses a centralized location
service to determine the destination of the request. SIP nodes can
avoid the use of a centralized location service by sharing the
responsibility of a location service in a distributed way. The use
of P2PP allows a SIP node to accomplish this by creating an overlay
among participant nodes. The interface between P2PP and SIP is
defined through an API discussed in Section 8.
4.4. Request Routing
A peer can issue a request in a recursive or an iterative manner. In
recursive routing, the request traverses the peers until it reaches
the peer responsible for the resource-object if it exists. The peer
issuing the request has no control over the peers which the request
may traverse. In iterative routing, the peer sends a request to
another peer which replies with the network address of the peer to
which the request should be forwarded. The requesting peer then
forwards the request directly to this peer. In this way, the
requesting peer has control over the peers through which the request
is forwarded.
A request can also be forwarded in an iterative parallel way. The
requesting peer can send the request to multiple peers at the same
time. The requesting peer designates one request copy as primary.
(Open Issue: What are the benefits of designating one copy as
primary?)
The choice of using recursive or iterative routing is on a per-
request rather than per-overlay basis.
4.5. Transport
A node may decide to send the request over a reliable or unreliable
transport in a recursive or an iterative manner. This section
Baset & Schulzrinne Expires January 3, 2008 [Page 12]
Internet-Draft Peer-to-Peer Protocol July 2007
explores various tradeoffs in the use of reliable vs. unreliable
transports for request forwarding and recommends the use of reliable
transport such as TCP unless otherwise specifically noted.
The node issuing the request determines the destination for the
request by applying a local nextHop() operation on its routing and
neighbor-table. A node may have a reliable connection such as TCP
with some or all of its routing and neighbor table entries. If
recursive routing is used, a node should send the request over a
reliable transport to the node(s) returned by the nextHop()
operation, if it has a reliable connection with them. Otherwise, it
may send the request over an unreliable transport such as UDP.
If iterative routing is used, the request originator will receive a
302 (Next Hop) reply from the peer it sent the request, if that peer
cannot accomplish the request. The request originator must now send
the request to this next hop. It is quite unlikely that the request
originator will have a reliable transport connection with the next
hop peer received in the 302 response and will have to establish a
reliable transport connection if it were to prefer the use of
reliable transport. Thus, an application may prefer the use of
unreliable transport such as UDP, if iterative routing is used.
In a peer-to-peer network, a node is only concerned with its own
routing peers. It does not necessarily need to know which other
peers have this node in their routing tables. Using TCP for overlay
maintenance will require that a node not only manages TCP connections
for its own routing tables, but also accept incoming TCP connections
for other nodes' routing tables. In a Chord network with N peers, a
peer will need to maintain logN connections for its routing table.
It will also receive logN connections from other peers for their
routing tables. Thus, it will at least need to maintain 2*logN
connections. The typical buffer space per socket is eight kilobytes,
and maintaining 300 connections consumes a total memory of 2.4 MB,
which is a little fraction of the total memory current systems have.
(Open Issue: what are the other implications of maintaining TCP
connections for routing-table entries? What about many simultaneous
connections from one IP address resulting from multiple applications
or NAT?)
Security is a concern for peer-to-peer deployments and peers may
choose TLS over TCP as the underlying transport protocol. Since, the
peers can have heterogeneous capabilities, it is an open issue
whether using a light-weight TLS-like protocol might be better than
TLS over TCP.
A peer receiving the request MUST use the same transport and port to
send the response. If the request was sent over UDP, and the
Baset & Schulzrinne Expires January 3, 2008 [Page 13]
Internet-Draft Peer-to-Peer Protocol July 2007
response size may exceed MTU, the peer should reply with a 413
(Message Too Large) response. It is up to the peer issuing the
request to send the request over a reliable transport such as TCP.
4.5.1. Listening Ports
The specification proposes a standard UDP and TCP listening port to
be assigned by IANA. The current implementation uses port 7080 for
both UDP and TCP listening.
4.6. NAT and Firewall Traversal
In an Internet scale deployment, it is possible that some nodes are
behind NATs and firewalls. It is up to the implementer of the
overlay to decide whether there is a need to perform NAT or firewall
traversal. If so, then the peers SHOULD implement STUN [5], TURN
[6], and ICE [7] protocols and advertise this as a service in the
overlay. Many peers can advertise NAT traversal service under a
particular service name which is stored as a resource-object. One
possible option for peers is to choose the same name for NAT and
firewall traversal service in which case they will publish their
service advertisement at the same peer in the overlay. Node queries
looking for a NAT traversal peer will always end up at the same peer.
Another option is to use ReDiR mechanism [10] which allows
distributing service registration over multiple nodes and still do
logN lookups. (Open Issue: what are the possible approaches for
advertising NAT and firewall traversal service? Perhaps use AS or
network coordiantes? ReDiR mechanism needs further elaboration.)
4.7. Node Capabilities
A peer MAY advertise its capabilities such as its link bandwidth, CPU
and bandwidth utilization. Advertising link bandwidth and its
utilization is useful because it determines whether a peer can be
used as a relay for TURN [6]. It is currently an open issue what is
the best way for a node to reasonably estimate these quantities. One
option is that nodes can advertise a service that uses STUN to
estimate bandwidth. The nodes looking to estimate their link
bandwidth can then locate the peers advertising bandwidth estimation
service.
Baset & Schulzrinne Expires January 3, 2008 [Page 14]
Internet-Draft Peer-to-Peer Protocol July 2007
5. P2PP Processing Overview
5.1. Node State
A P2PP peer maintains the following state:
Peer-to-Peer Algorithm: Peer-to-peer algorithm of the overlay.
Overlay-ID: ID of the overlay this peer is part of.
Hash Algorithm: The hash algorithm, if any, being used.
Uptime: The uptime of this peer.
Routing Table: A table of other peers in the overlay. For each
peer, following information is maintained.
Peer-ID: The ID of the peer. For a structured p2p algorithm,
it is typically the hash of the IP address of the peer.
Otherwise, it can be an IP address or some unique ID.
IP address: The IP address of the peer.
RTT: The round-trip-time of this peer. If TCP is used, an
application may obtain this value from the TCP stack if the
underlying OS supports it.
Uptime: The uptime of the peer.
Neighbor Table: A table of peers with ID adjacent to the peer's ID
in a structured overlay. For each peer, following information is
maintained.
Peer-ID: The ID of the peer. For a structured p2p algorithm,
it is typically the hash of the IP address of the peer.
Otherwise, it can be an IP address.
IP address: The IP address of the peer.
RTT: The round-trip-time of this peer.
Uptime: The uptime of the peer.
Number of Neighbors: Total number of peers in routing and neighbor
tables.
Baset & Schulzrinne Expires January 3, 2008 [Page 15]
Internet-Draft Peer-to-Peer Protocol July 2007
Resource Table: Resource-objects this peer is responsible for.
Replicated Resource Table: Resource-objects this peer stores as
backup for other objects.
5.2. Request Generation and Response Processing
A request can be issued in a recursive or an iterative manner. A
node forwarding a request creates a request transaction and passes it
the request to deliver it to the intended recipient. Each
transaction is identified by a random and unique 32-bit unsigned
integer called transaction-ID. The request is generated and
responses are processed according to the following rules:
1. Requests cannot be combined. (Open Issue: It does not matter
over TCP)
2. The transport of the request SHOULD be preserved, i.e., if the
request was received over TCP, it SHOULD be forwarded over TCP.
See Section 5.2.1 for additional considerations.
3. A peer issuing the request MAY request to receive a copy of the
routing and neighbor tables of the peer to whom the request was
sent. It does so by setting the request-routing-table and
request-neighbor-table flags in the Request-Options object.
Considerations apply for recursive (Section 5.2.1) and iterative
routing (Section 5.2.2).
4. If the peer issuing the request receives a 480 Alternative
Service response, it SHOULD retry the request over TCP directly
to the peer which generated this response.
5. The request SHOULD be sent over TCP if its size exceeds UDP MTU
regardless of whether recursive or iterative routing is being
used.
6. The response is matched to the appropriate request transaction by
the transaction-ID.
Following considerations apply if the request is being issued in a
recursive or an iterative manner.
5.2.1. Issues in Recursive Routing
The request can be sent over TCP or UDP by the originator. (Open
Issue: should only TCP or UDP be used for request forwarding?)
If the request was sent over UDP, the node issuing the request SHOULD
Baset & Schulzrinne Expires January 3, 2008 [Page 16]
Internet-Draft Peer-to-Peer Protocol July 2007
always set the in-separate-request flag in the Request-Options
object. The reason is that the routing and neighbor tables of the
nodes encountered along the path of the request are not likely to fit
within the response UDP packet.
If request was sent over TCP and request-routing-table and request-
neighbor-table flags were set, each node along the request path adds
a copy of its routing or neighbor table in the response (Open Issue:
The response size can explode). If the node issuing the request
wishes to receive a copy of routing or neighbor table not in the
response but in a separate request, it sets the in-separate-request
flag in the Request-Options object.
If recursive routing is being used, and a peer receives a response,
it consults the transaction-association (TA) table. If it finds a
matching entry, it forwards the response to the peer from which it
received the request. If request was sent over TCP and request-
routing-table and request-neighbor-table flags were set and in-
separate-request flags were not set, the peer forwarding the response
adds a copy of its own routing or neighbor table and updates the
message length in the common header.
5.2.2. Issues in Iterative Routing
The request SHOULD be sent over UDP if the request size fits within
UDP MTU.
If the request was sent in an iterative manner over TCP, the node
SHOULD not set the in-separate-request flag.
If the request was sent in an iterative manner over UDP, the node
issuing the request MAY set the partial-reply flag in the Request-
Options object. If set, the node receiving the request includes in
its reply as much routing or neighbor table peers as permitted by the
UDP MTU. A node issuing the request MAY also set partial-reply and
in-separate-request flags in the Request-Options object. A node
receiving the request with these flags set includes in its reply its
routing or neighbor entries as permitted by the UDP MTU. It sends
the remaining portion of routing or neighbor table in a separate
ExchangeTable request.
5.3. Request Processing and Response Generation
A request can be received over UDP or TCP. A request received over
UDP is processed according to the following steps:
1. The peer checks the TTL field in the common header. If TTL is
equal to zero and the peer cannot give a definitive answer, it
Baset & Schulzrinne Expires January 3, 2008 [Page 17]
Internet-Draft Peer-to-Peer Protocol July 2007
MUST reply with a 410 TTL Hops Exceeded response. The response
is always sent to the peer from whom the request was received and
not to the peer who issued the request.
2. If TTL is greater than zero, recursive routing was being used,
and the peer cannot give a definitive answer for the received
request, it determines the next hop from its routing or neighbor
tables, creates a new request transaction, and passes it the
request after decrementing TTL by one in the common header. The
rest of the forwarded request remains unchanged. The peer
creates a transaction association (TA) between the response and
request transactions. Also, the peer MUST immediately send a 100
Trying response using the same transport and port on which the
request was received. (Open Issue: Can we eliminate 100 Trying
altogether?)
3. If TTL is greater than zero, iterative routing was being used,
and the peer cannot satisfy the request, it determines the next
hop from its routing or neighbor tables. It then replies with a
302 Next Hop response and includes its Peer-Info and the next hop
Peer-Info object in the response.
4. If a peer receiving the request determines that it can give a
definitive answer which will fit within UDP MTU, it checks if the
Request-Options object was present and that request-routing-table
or request-neighbor-table and in-separate-request flags were set.
If set, the peer waits for a random time between T2 and T3
seconds, and sends a copy of its routing or neighbor table or
both in an ExchangeTable request to the peer which issued the
request. If in-separate-request was not set, the peer generating
a definite response includes in the response as much of the
requested routing or neighbor table entries as permitted by the
UDP MTU.
5. If the peer receiving the request determines that it can give a
definitive answer but the response will not fit within UDP MTU,
it can reply with a 413 Message Too Large or a 480 Alternative
Service response to indicate to the node issuing the request to
retry the request over TCP.
6. The peer checks if it can update its routing and neighbor tables
from the received request.
A request received over TCP is processed according to the following
steps:
1. The peer checks the TTL field in the common header. If TTL is
equal to zero and the peer cannot give a definitive answer, it
Baset & Schulzrinne Expires January 3, 2008 [Page 18]
Internet-Draft Peer-to-Peer Protocol July 2007
MUST reply with a 410 TTL Hops Exceeded response. The response
is always sent to the peer from whom the request was received and
not to the peer who issued the request.
2. If TTL is greater than zero, recursive routing was being used,
and the peer cannot give a definitive answer for the received
request, it determines the next hop from its routing or neighbor
tables, creates a new request transaction, and passes it the
request after decrementing TTL by one in the common header. The
rest of the forwarded request remains unchanged. The peer
creates a transaction association (TA) between the response and
request transactions.
3. If TTL is greater than zero, iterative routing was being used,
and the peer cannot satisfy the request, it determines the next
hop from its routing or neighbor tables. It then replies with a
302 Next Hop response and includes its Peer-Info and the next hop
Peer-Info objects in the response.
4. If a peer receiving the request determines that it can give a
definite answer, it checks if the Request-Options object was
present and that request-routing-table or request-neighbor-table
and in-separate-request flags were set. If set, the peer waits
for a random time between T2 and T3 seconds, and sends a copy of
its routing or neighbor table or both in an ExchangeTable request
to the peer which issued the request. If in-separate-request was
not set, the peer includes a copy of its routing and neighbor
table in the response.
5.4. Message State Machine
(Open Issue: The state machines for reliable and unreliable
transports need to be combined.)
5.4.1. Request State Machine
The request transaction state machine for unreliable transports is
shown in Figure 1.
The "Trans_Req" (abbreviation for transmit request) state is entered
when a peer issues or forwards a request. When entering this state,
the transaction SHOULD set timer T2 to fire in T1 seconds. It SHOULD
initialize variable n to zero. If Timer T2 fires and n is less than
the maximum allowed retransmissions N, the request is retransmitted,
n is incremented and timer T2 is set to fire in (2^n * T1) seconds.
If timer T2 fires and n is equal to N, the state machine transitions
to "Failed" state and is terminated.
Baset & Schulzrinne Expires January 3, 2008 [Page 19]
Internet-Draft Peer-to-Peer Protocol July 2007
If a 2xx-4xx response is received, the transaction enters "Success"
state and is terminated.
+-----------+
| |
| Initial |
| |
+-----------+
|
| tx_Request / set Timer T2
Timer T2 fires / |
If n != N V Transport Err. or
reset T2 +------------+ Timer T2 fires and
tx_Request +------| | n == N
| | Trans_Req |---------------+
+----->| | |
+------------+ |
| |
| rx_Resp (2xx-4xx) / |
| Pass to app. |
V |
+-----------+ |
| | |
| Success | |
| | |
+-----------+ |
|
|
+-----------+ |
| | |
| Failure |<---------------+
| |
+-----------+
Figure 2: request transaction for unreliable transports
The request transaction state machine for reliable transports is
shown in Figure 2.
The "Trans_Req" state is entered, when a peer issues or forwards the
request. When entering this state, it SHOULD set timer T5. The
value of T5 is application dependent. If timer T5 fires, the state
machine transitions to "Failed" state and is terminated. If a 2xx-
4xx response is received, the state machine transitions to "Success"
state and is terminated. If the request was forwarded in a recursive
manner, the application MUST not terminate the reliable-transport
connection. If the request was forwarded in an iterative manner, an
Baset & Schulzrinne Expires January 3, 2008 [Page 20]
Internet-Draft Peer-to-Peer Protocol July 2007
application MAY terminate the reliable-transport connection if it
does not anticipate its reuse.
+-----------+
| |
| Initial |
| |
+-----------+
|
| tx_Request / set Timer T5
|
V
+------------+ Transport Err. or
| | Timer T5 fires
| Trans_Req |---------------+
| | |
+------------+ |
| |
| rx_Resp (2xx-4xx) / |
| Pass to app. |
V |
+-----------+ |
| | |
| Success | |
| | |
+-----------+ |
|
|
+-----------+ |
| | |
| Failure |<---------------+
| |
+-----------+
Figure 3: request transaction for reliable transports
5.4.2. Response State Machine
There is no state machine for responses. Each request generates a
response.
If recursive routing is being used and the request is received over
an unreliable transport, a 100 Trying response SHOULD be sent.
5.5. Resource-object
Baset & Schulzrinne Expires January 3, 2008 [Page 21]
Internet-Draft Peer-to-Peer Protocol July 2007
5.6. Routing-table Maintenance
5.7. Timers
This section defines timers for request and response state machines.
Timer Value
----------------------
T0 5s
T1 500ms
T2 T0
T3 2*T0
T5 T0 (Application dependent)
T6 T0 (Application dependent)
Baset & Schulzrinne Expires January 3, 2008 [Page 22]
Internet-Draft Peer-to-Peer Protocol July 2007
6. Message Formats
All P2PP messages begin with a common header, followed by a sequence
of type-length-value (TLV) objects. This section describes all P2PP
messages and their contents at a high level in ABNF [4].
We define eight messages for service interface namely, join, leave,
keep-alive, lookuppeer, exchangetable, query, replicate, and transfer
and three messages for data interface namely, publish, lookupobject
and removeobject.
P2PP-Msg = Join / Leave / Keep-alive /
LookupPeer / ExchangeTable / Query / Replicate / Transfer
Publish / LookupObject / RemoveObject
A node (client) which does not participate in an overlay does not
need to implement all of these messages. Client-to-peer messages are
independent of the p2p algorithm being used. The peer-to-peer
messages are also independent of the p2p algorithm being used because
a peer locally determines the next hop after consulting its routing
or neighbor tables. Note that peers in an overlay only run one type
of p2p algorithm such as Chord, Pastry, Kademlia or Gnutella and
there is no mixing of the p2p algorithm, i.e., it is not possible for
some nodes in the same overlay to only use Chord and some nodes to
only use Pastry. However, a peer can simultaneously participate in
two different overlays.
6.1. Join
To insert itself in the overlay, a node sends a join request to a
peer already in the overlay. The mechanism to discover a peer
already in the p2p network is independent of any particular p2p
algorithm being used [21]. The possible neighbors of this new node
MUST be informed about the join request.
A node MUST send a Query request to a discovered node before a join
request. The Query request is used to determine overlay parameters
such as overlay-ID, peer-to-peer and hash algorithms, and request
routing method (recursive vs. iterative) being used.
The node then constructs a join request and passes it to the request
transaction. The node that wishes to participate in the overlay MUST
set the 'insert' flag in the Request-Options object. The node that
does not wish to participate in the overlay MUST NOT set the 'insert'
flag in the overlay. The peer receiving a join request from a client
does not forward it to other peers in the overlay and immediately
returns a 200 (Ok) response. (ToDo: Remove 'insert' flag and instead
Baset & Schulzrinne Expires January 3, 2008 [Page 23]
Internet-Draft Peer-to-Peer Protocol July 2007
check the P (peer or client) flag in the common header.)
A peer MAY request to receive a copy of routing and neighbor tables
of the nodes which receive the join request. It does so by following
the rules defined in Section 5.2
Join = Common-header
Request-Options
Peer-Info
If a node receiving the join request is not the immediate neighbor of
this joining peer, and recursive routing is being used, it forwards
the request to a suitable peer by following the rules defined in
Section 5.3.
A peer receiving an iterative join request sends a 302 Next Hop
response about the next hop if the joining peer will not be its
immediate neighbor.
If a peer receiving the request determines that the joining node will
be its neighbor, it MUST send a 200 (Ok) response to the node from
which it received the request. The response contains the time before
which the joining peer SHOULD send a keep-alive message. The
response SHOULD also contain a copy of the neighbor table of the
peer.
Once the node issuing the join request receives a 200 (Ok) response,
it checks the received neighbor table. It then sends a join request
with the S flag set in the Request-Options object to each of the
neighbors. The join request with S flag set indicates the nodes that
the joining node will be their new neighbor. It is really up to the
peer generating the 200 (Ok) response to decide, based on the p2p
algorithm being used, which neighbors (successors, predecessors) a
joining peer may contact to insert itself appropriately in the
overlay. The neighbors of this newly joining peer SHOULD update
their neighbor and routing tables appropriately. After the receipt
of the join request, the neighbors wait for a random time before
exchanging their neighbor tables.
Peers in the overlay MAY decide to reject a join request with a 407
Request Rejected response because it does not satisfy the overlay
policy. NAT and node capacity examples of such policies. This
specification does not specify any policy for the node admission and
defers this decision to the overlay implementer.
Peers in the overlay MAY not be willing to admit a new node with no
history about its uptime. If so, they reply with a 407 Join Request
Deferred response and an Expires object after which the peer can
Baset & Schulzrinne Expires January 3, 2008 [Page 24]
Internet-Draft Peer-to-Peer Protocol July 2007
reissue the join request. The peer receiving this response SHOULD
resend the join request with 'insert' flag reset in the Request-
Options object to insert itself as a client in the overlay. It
SHOULD retry the join request after the passage of time in the
Expires object.
Join (Resp) = Common Header
Response-code
Peer-Info
[Peer-Info]
[Expires]
[Routing-table]
[Neighbor-peers]
[Ext]
Routing-table = Num-entries
[Peer-Info]*
Neighbor-peers = Num-entries
[Peer-Info]*
6.2. Leave
A peer sends a leave request to gracefully inform its neighbors about
its departure. The neighbors MUST update their neighbor pointers and
take over the peer-IDs and resource-objects the leaving node is
responsible for.
A peer SHOULD send the leave message over TCP as the size of peer-IDs
and resource-objects is likely to exceed MTU. However, a peer SHOULD
avoid a new TCP connection to send the leave message.
A peer receiving a leave request MUST immediately respond with a 200
(Ok).
A client MAY also send a leave message to inform its routing peers
about its impending departure.
(Open Issue: The user should not have to wait for the p2p application
to shut down, which in turn is waiting for the receipt of leave
response.)
Leave = Common-header
Peer-Info
[Peer-Info]*
[Resource-object]*
Baset & Schulzrinne Expires January 3, 2008 [Page 25]
Internet-Draft Peer-to-Peer Protocol July 2007
Leave (Resp) = Common-header
Peer-Info
6.3. Keep-alive
A peer sends a periodic keep-alive message to its routing and
immediate peers. A peer MUST send keep-alive to its neighbor and
routing table peers before the expiry of their refresh interval. The
two immediate neighbors do not need to send a periodic keep-alive
message to each other and can use various heuristics for keep-alive
timer duration such as randomly sending a keep-alive within an
interval. Also, it is possible that a peer may receive a request
from its neighbors before the expiry of the keep-alive timer. The
arrival of the request should be considered as the receipt of a keep-
alive message and the expiry timers should be updated accordingly.
If a neighbor fails, a peer may have to immediately find a new
neighbor to ensure lookup correctness using LookupPeer request. If a
routing entry fails, a node may choose to repair it immediately or
defer till a lookup request arrives.
Keep-alive can be considered as a lookup message for an existing
entry in the routing table. Keep-alives SHOULD be sent over UDP.
(Open Issue: Should Keep-alives be sent when a node has a TCP
connection with its neighbor and routing peers?)
Keep-alive = Common-header
Peer-Info
Expires
A peer receiving a keep-alive request responds with a 200 (Ok)
response and includes an Expires object. The request originator MUST
send another request before the expiration of this time.
Keep-alive (Resp) = Common-header
Peer-Info
Expires
6.4. LookupPeer
A peer MAY send a lookuppeer message to update its routing or
neighbor table entries. For DHTs, a peer lookup is different from an
ordinary lookup message because the requesting peer is seeking a
peer(s) whose peer-ID may immediately succeed or precede a certain ID
or may lie within a range of IDs.
LookupPeer = Common-Header
Peer-Info
Baset & Schulzrinne Expires January 3, 2008 [Page 26]
Internet-Draft Peer-to-Peer Protocol July 2007
PLookup
A peer receiving an iterative routing-peer lookuppeer request will
send a 302 Next Hop response there is another peer with peer-ID close
to the peer-ID being searched for.
LookupPeer (resp) = Common-Header
Peer-Info
[Peer-Info]
6.5. ExchangeTable
A peer sends a exchangetable request to another peer to request a
copy of its neighbor or routing table. A peer SHOULD send an
exchangetable request over TCP since the size of the routing table is
likely to exceed the MTU size.
ExchangeTable = Common-Header
Peer-Info
ExchangeTable (resp) = Common-Header
Peer-Info
[Routing-table]
[Neighbor-peers]
6.6. Query
A peer sends a query request to any peer in the overlay requesting
information about the overlay algorithm, the hash algorithm (if any),
key size, and overlay-ID. A peer MUST send the query request to an
existing peer in the p2p network before sending a join request.
Query = Common-Header
Peer-Info
Query (resp) = Common-Header
Peer-Info
P2P-options
[Ext]
P2P-options = Hash-algorithm
Hash-algorithm-length
DHT-algorithm
OverlayID-length
Overlay-ID
Baset & Schulzrinne Expires January 3, 2008 [Page 27]
Internet-Draft Peer-to-Peer Protocol July 2007
The Ext denotes that this message is extensible and additional TLV
objects may be added later.
6.7. Replicate
A peer can replicate its resource-objects using the Replicate
request. The choice of nodes on which the resource-objects should be
replicated is left to the implementer of the overlay. Heuristics
such as replicate to the next k neighbors of this node can be used.
A node needs to replicate data to its replica neighbors when a
resource-object is added or modified. The replicate request SHOULD
be sent over TCP.
Replicate = Common-header
Peer-Info
[Peer-Info]*
[Resource-object]*
Replicate (Resp) = Common-header
Peer-Info
6.8. Transfer
A peer already in the overlay uses transfer request to transfer the
resource-objects to the newly joining node. Similarly, a peer
gracefully leaving the p2p network uses transfer request to transfer
its resource-objects to its neighbors.
Transfer = Common-header
Peer-Info
[Peer-Info]*
[Resource-object]+
Transfer (Resp) = Common-header
Peer-Info
6.9. Publish (put)
A peer sends an publish request to a peer already in the p2p network
to insert a resource-object. The publish operation involves locating
the peer responsible for the resource-object and then inserting
either the network address of the resource-object publisher or the
resource-object itself. The publish operation can also be used to
update an existing resource-object.
The publisher of the resource-object MUST also include information
about its owner in the publish request because the it is not
Baset & Schulzrinne Expires January 3, 2008 [Page 28]
Internet-Draft Peer-to-Peer Protocol July 2007
necessarily the owner of the resource-object. It is possible that
multiple owners may wish to publish or update an existing resource-
object and a peer may want to retrieve part of the resource-object
published or updated by a certain owner. (Open Issue: What is the
format of the owner object?)
The semantics of the resource-object are managed by the application.
P2PP only requires each resource to have a resource-ID.
Publish = Common-header
Peer-Info
Request-Options
Resource-Object
Insert (Resp) = Common-header
Response-code
Expires
6.10. LookupObject (get)
A peer issues a lookupobject request to retrieve a resource-object
from the p2p network. It includes the Resource-object TLV in the
request and sets the 'I' flag to zero.
The resource-object size may exceed UDP MTU if the request was sent
over UDP. The node responsible for the resource-object replies with
a 480 (Alternative Service) response. The querier, on receiving this
response, reissues the lookup request over TCP to the peer
responsible for the resource-object.
Lookup = Common-header
Peer-Info
Request-Options
[Owner]
Resource-object
If the resource-object is found, the peer responsible for it replies
with a 200 (Ok) response. If a peer receiving a lookup request
determines that it cannot forward the request, it generates a 404
(Not Found) response.
Lookup (resp) = Common-header
Peer-Info
Resource-object
Baset & Schulzrinne Expires January 3, 2008 [Page 29]
Internet-Draft Peer-to-Peer Protocol July 2007
6.11. RemoveObject
A node sends the remove request to remove the resource-object before
its lifetime expiration.
Remove = Common-header
Peer-Info
[Owner]
[Resource-object]
Remove (Resp) = Common-header
Peer-Info
Baset & Schulzrinne Expires January 3, 2008 [Page 30]
Internet-Draft Peer-to-Peer Protocol July 2007
7. Bit-Level Formats and Errors
This section defines PDUs for the messages and their methods defined
above.
7.1. Common Header
All P2PP messages begin with a common header. It has a fixed format,
as shown below.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| V=3 |T|P| Reserved | Request Type | TTL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Cookie |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Transaction-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version (3 bits): The protocol version number. The current version
is 1.
T flag: If set (T=1), the message is a request. Otherwise, it is a
response.
P flag: If set (P=1), the message is sent by a peer. Otherwise, a
client is request originator.
Request Type (8 bits): The request message type such as join and
leave.
TTL (8 bits): A hop count for the number of peers this request can
traverse. (Open Issue: Upper limit of 256 maybe too stringent.
If TTL becomes zero, a node replies with a 410 TTL hops exceeded
response. The request can then be reissued to the node generating
410 response.)
Magic cookie (32 bits): A field with a fixed value (0x596ABF0D) to
differentiate P2PP messages from other protocol messages from
other protocols such as STUN.
Baset & Schulzrinne Expires January 3, 2008 [Page 31]
Internet-Draft Peer-to-Peer Protocol July 2007
Transaction-ID (32 bits): A unique number to match responses with
the originated requests.
Message Length (32 bits): The byte length of the message after the
common header itself.
For responses, the rightmost 10-bits of the Reserved field contain
the response code.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| V=3 |T|P|r| Response code | Request Type | TTL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Cookie |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Transaction-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7.2. General Object Format
Each P2PP object begins with a fixed header giving the object type
and length. This is followed by the object Value.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|A|B|r|r| Object-Type |r|r|r|r| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Value //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
AB=00 "(Mandatory)": If the object is not understood, the entire
message containing it MUST be rejected with an "Object Type Error"
message with sub code 1 ("Unrecognized Object").
AB=01 "(Ignore)": If the object is not understood, it MUST be
deleted and the rest of the message processed as usual.
Object-Type (8 bits): An IANA-assigned identifier for the type of
the object.
Length (16 bits): The byte length of the object.
The combination AB=10 and AB=11 are reserved.
Baset & Schulzrinne Expires January 3, 2008 [Page 32]
Internet-Draft Peer-to-Peer Protocol July 2007
7.3. P2PP TLV Objects
7.3.1. Peer-Info
Type: Peer-Info
Length: Variable (depends on the length of Peer-ID, IP version and
unhashed key if any. It can include Uptime, Neighbor/
resource-utilization, and NAT and firewall TLV objects.)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Peer-ID //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Additional Information :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Peer-ID (variable): The fixed-length output of the hash function
negotiated at join. If the Algorithm-Len field queried at join is
zero, a length field of 16 bits MUST be present before Peer-ID.
Unhashed-ID TLV object MUST NOT be included.
Additional Fields: Various additional fields that may be useful for
a particular network environment. Their inclusion is left to the
overlay implementer.
7.3.1.1. Additional Information Fields
Unhashed ID:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Unhashed-ID //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Unhashed-ID (variable): Unhashed ID of this peer. This is only
included in a DHT-based overlay. If the unhashed-ID is the same
as IP-address of the peer, it SHOULD NOT be included.
Uptime:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Uptime |
Baset & Schulzrinne Expires January 3, 2008 [Page 33]
Internet-Draft Peer-to-Peer Protocol July 2007
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Uptime (32 bits): The uptime of this peer in number of seconds.
Resource-Info:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Neighbors | CPU Util. | BW. Util. |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Peer bandwidth |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Number of Neighbors (16 bits): The number of routing and immediate
neighbors of this peer.
CPU Utilization (8 bits): CPU Utilization of this peer on a scale of
1 to 100.
Bandwidth Utilization (8 bits): Bandwidth utilization of this peer
on a scale of 1 to 100.
Peer Bandwidth (32 bits): Estimated peer bandwidth in kilo bits per
second. This is tricky to determine and is TBD.
Address-Info:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|IP-Ver | Num | HT |Reserved| Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Peer address //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP-Ver (4 bits): The IP version number, 4 or 6.
Num (4 bits): Number of peer IP address, port, transport and address
type 4-tuples gathered using Interactive Connectivity
Establishment (ICE) [7].
HT (4 bits): The address type of the peer as defined in ICE [7].
One of host (0000), server reflexive (0001), peer reflexive
(0010), or relayed candidate (0011).
Baset & Schulzrinne Expires January 3, 2008 [Page 34]
Internet-Draft Peer-to-Peer Protocol July 2007
Peer Address (variable): The IP address of the peer. Its length
depends on the IP-Ver field.
Port (16 bits): The port on which this peer listens for requests.
7.3.2. Request-Options
Type: Request-Options
Length: Fixed (32-bit word)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|I|P|R|N|E|A|S| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
I (1 bit): If set (I=1), then insert this peer in the overlay at
join. A P2PSIP client MUST set this bit to zero.
P (1 bit): If set (P=1), designate one copy as primary for parallel
lookups.
R (1 bit) request-routing-table: If set (R=1), send a copy of the
routing table to the peer issuing the request in a seperate
ExchangeTable request. The transmission of routing-table copy is
governed by the in-separate-request and partial-copy flags.
N (1 bit) request-neighbor-table: If set (N=1), send a copy of the
neighbor table to the peer issuing the request using the mechanism
described for routing-table.
E (1 bit) in-separate-request: If set (E=1), and if P or R are also
set, the peer is requesting to receive routing or neighbor table
in an ExchangeTable request. If not set (E=0), and the request
was received over TCP, each peer along the request path can add a
copy of its routing or neighbor table before forwarding the
response.
A (1 bit) partial-reply: If set (A=1), the peer generating the
definite response sends a copy of the routing or neighbor table as
determined by the P and N flags in its response as permitted by
the UDP MTU. If E (in-separate-request) is also set, the rest of
the routing or neighbor table is sent in a separate Update
request.
Baset & Schulzrinne Expires January 3, 2008 [Page 35]
Internet-Draft Peer-to-Peer Protocol July 2007
S (1 bit): If set (S=1) and if I flag is also set, the request is
being sent to the immediate neighbors of the newly joining peer.
7.3.3. P2P-Options
Type: P2P-Options
Length: Variable (depends on the length of Overlay-ID)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Algorithm | Algorithm-Len | P2P-Algorithm | OverlayID-Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Base | Overlay-ID //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
R flag: If set (R=1), the peers in the overlay use recursive request
forwarding.
Algorithm (6 bits): An IANA-assigned identifier for the hash
algorithm.
Algorithm-Length (8 bits): The byte length of the hash algorithm.
If set to zero, then no hash algorithm is used.
P2P-Algorithm (8 bits): An IANA-assigned identifier for the P2P
algorithm being used.
OverlayID-Length (8 bits): The byte length of overlay-ID.
Overlay-ID (variable): Overlay-ID.
7.3.4. Routing-Table
Type: Routing-Table
Length: Variable (depends on the number of Peer-Info objects)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Num entries | |
+-+-+-+-+-+-+-+-+ [Peer-Info]+ +
// //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Baset & Schulzrinne Expires January 3, 2008 [Page 36]
Internet-Draft Peer-to-Peer Protocol July 2007
Num-entries (8 bits): Number of Peer-Info objects in the routing
table.
Peer-Info (variable): One or more Peer-Info objects.
7.3.5. Neighbor-table
Type: Neighbor-Table
Length: Variable (depends on the number of Peer-Info objects)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Num entries | |
+-+-+-+-+-+-+-+-+ [Peer-Info]+ +
// //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Num-entries (8 bits): Number of Peer-Info objects in the neighbor
table.
Peer-Info (variable): One or more Peer-Info objects.
7.3.6. PLookup
Type: PLookup
Length: Variable (depends on the length of Peer-ID and whether this
is a range lookup)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Num |r|r|R| Peer-ID (equal to Algorithm-Len) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Peer-ID //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Num (5 bits): Number of peers to look for.
R (1 bit): If set (R=1), then it is a range lookup.
Baset & Schulzrinne Expires January 3, 2008 [Page 37]
Internet-Draft Peer-to-Peer Protocol July 2007
Peer-ID (variable): Peer-ID. If Algorithm-Len queried at join is
zero, then a length field of 16 bits MUST be present before
Peer-ID.
Peer-ID (variable): Peer-ID. Included only if R is set. If
Algorithm-Len queried at join is zero, then a length field of 16
bits MUST be present before Peer-ID.
7.3.7. Resource-Object
Type: Resource-Object
Length: Variable (depends on the size of resource-object)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|I| Reserved | Cont-type | Resource-ID //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Resource-object //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Additional Information Fields //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
I flag: If set (I=1), the resource-object is included.
Cont-type: An IANA assigned idenfitier for the type of content
contained in this resource-object.
Resource-ID (variable): The ID of the resource object. For DHT-
based overlays, its length is equal to the length of the hash
algorithm. If Algorithm-Len field negotiated at join is zero, a
length field of 16-bits must precede resource-ID.
Resource-object (variable): Variable length.
7.3.7.1. Additional Information Fields
The resource-object may use the following TLVs to express additional
information about itself.
Owner (variable): The owner TLV object.
Expires (fixed): The expires TLV object.
Baset & Schulzrinne Expires January 3, 2008 [Page 38]
Internet-Draft Peer-to-Peer Protocol July 2007
7.3.8. Expires
Type: Expires
Length: Fixed (32-bit word)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Expire time in seconds |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Expires (32 bits): Time in seconds
7.3.9. Owner
Type: Owner
Length: Variable
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Owner //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Owner (variable): The owner of the Resource-Object. Format TBD.
7.3.10. Credentials
TBD. Need an elaborate credentials mechanism.
Type: Credentials
Length: Variable
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Credentials //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Baset & Schulzrinne Expires January 3, 2008 [Page 39]
Internet-Draft Peer-to-Peer Protocol July 2007
Credentials (variable): The credentials of the peer sending the join
request. TBD.
7.4. Errors
7.4.1. Error Object
Type: Error
Length: Variable
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link MTU | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Additional Information |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Link MTU (16 bits): The MTU for a link along which a message cannot
be sent. Other error info TBD.
7.4.2. Response Codes
There are four different types of response codes. They are:
1xx (Provisional): Response data which provides an update on the
progress of the request. These responses are only sent when
request is sent over an unreliable transport in a recursive
manner.
2xx (Success): Response data which indicates that the request has
been processed successfully in some sense.
3xx (Redirect): Response data which indicates that the request
should be redirected.
4xx (Request Failure): Response data which indicates that the
request has failed.
2xx-4xx responses are classified as definite responses while 1xx are
provisional responses.
7.4.2.1. 1xx (Provisional) Responses
Baset & Schulzrinne Expires January 3, 2008 [Page 40]
Internet-Draft Peer-to-Peer Protocol July 2007
100 Trying. The request is being tried. This response is only sent
if the request was sent in a recursive manner over UDP, and needs
to be forwarded to the next peer.
7.4.2.2. 2xx (Successful) Responses
200 Ok. A successful answer to the request.
7.4.2.3. 3xx (Redirect) Responses
302 Next Hop. This response is only generated for iterative
requests if the peer receiving the request is not the final
destination for the request.
7.4.2.4. 4xx (Permanent-Failure) Responses
400 Bad request. There was an error parsing the request.
404 Not found. This response is generated for a lookup request if
the resource-object being searched for is not found.
405 Error inserting object. There was an error inserting the
resource-object.
406 Request rejected. The request was understood but rejected by
the peer.
407 Join request deferred. The peer issuing the join request should
retry after a certain time.
410 TTL hops The number of TTL hops exceeded.
413 Message too large. The response message size was too large.
This response is typically generated for unreliable transports.
418 Timeout. The request timed out. This response is generated when
request was forwarded in a recursive manner over UDP and no
response was received.
Baset & Schulzrinne Expires January 3, 2008 [Page 41]
Internet-Draft Peer-to-Peer Protocol July 2007
8. API between P2PP and Applications
An application using peer-to-peer protocol issues non-blocking calls
to P2PP layer to accomplish operations, namely, join, leave, publish,
lookup, remove, and query. Since an operation may take long time to
complete, an application supplies a call-back function for each API,
not shown in the parameters. The 'in' parameters are passed to P2PP
in the API call, whereas the 'out' parameters are returned in the
call-back function after the operation is complete. Upon success,
the call-back function returns a value of zero.
8.1. Query
Query([out]Overlay-ID, [out]P2P-Algorithm, [out]Hash-Algorithm,
[out]Hash-Algorithm-Len, [in]Overlay-peer-network-address,
[in]Overlay-peer-port)
8.2. Join
Join([in]Overlay-ID, [in]Overlay-peer-network-address, [in]Overlay-
peer-port)
An application uses this API to inform the P2PP layer to start the
join process.
8.3. Leave
Leave([in]Overlay-ID)
An application uses this API to inform the P2PP layer that it wishes
to leave the overlay immediately. An application does not wait for
this operation to be completed and may shut down immediately.
8.4. Publish
Publish([in]Resource-ID, [in]Resource-Object)
An application uses this API to publish a new resource-object in the
overlay or update an existing one.
8.5. Remove
Remove([in]Resource-ID)
An application uses this API to explicitly remove a resource-object
from the overlay.
Baset & Schulzrinne Expires January 3, 2008 [Page 42]
Internet-Draft Peer-to-Peer Protocol July 2007
8.6. Lookup
Lookup([in]Resource-ID, [out]Resource-Object)
An application uses this API to search for a resource-object in the
overlay. If the resource-object is found, it is returned in the API
call.
(Open Issue: Each operation should have a crypto-signed counterpart.)
Baset & Schulzrinne Expires January 3, 2008 [Page 43]
Internet-Draft Peer-to-Peer Protocol July 2007
9. Security Considerations
TBD.
Baset & Schulzrinne Expires January 3, 2008 [Page 44]
Internet-Draft Peer-to-Peer Protocol July 2007
10. Open Issues
1. Should recursive parallel routing be supported?
2. Peers can invite other peers in the overlay. Should this
mechanism be part of the P2PP messages or should this be a
separate mechanism?
3. How can a node estimate its CPU and bandwidth utilization?
4. Security
5. Should trust mechanism be part of the protocol?
6. Should client Peer-Info objects be inserted in the overlay?
7. Should diagnostic interface be merged with maintenance interface?
Baset & Schulzrinne Expires January 3, 2008 [Page 45]
Internet-Draft Peer-to-Peer Protocol July 2007
11. Acknowledgements
The authors will like to thank the following (in alphabetical order)
for their helpful comments and suggestions. Christian Dickmann, Jae
W. Lee, Kundan Singh, and Eunsoo Shim.
Baset & Schulzrinne Expires January 3, 2008 [Page 46]
Internet-Draft Peer-to-Peer Protocol July 2007
12. IANA Considerations
Listening Port: The port on which a peer listens for request. The
current implementation uses 7080.
Message Types: The P2PP common header contains a one byte message
type field. A message can either be a request or a response. The
following values are allocated by this specification for request
messages.
+--------------+----------------------------+
| Message Type | Message |
+--------------+----------------------------+
| 0 | Join |
| | |
| 1 | Leave |
| | |
| 2 | Keep-alive |
| | |
| 3 | LookupPeer |
| | |
| 4 | ExchangeTable (old Update) |
| | |
| 5 | Query |
| | |
| 6 | Replicate |
| | |
| 7 | Transfer |
| | |
| 21 | Publish (old Insert) |
| | |
| 22 | LookupObject (old Lookup) |
| | |
| 23 | RemoveObject (old Remove) |
+--------------+----------------------------+
Object Types: There is a one byte field in the object header. The
following values for object types are defined by this
specification.
Baset & Schulzrinne Expires January 3, 2008 [Page 47]
Internet-Draft Peer-to-Peer Protocol July 2007
+-------+-----------------+
| OType | Object Type |
+-------+-----------------+
| 0 | Peer-Info |
| | |
| 1 | P2P-options |
| | |
| 2 | Routing-table |
| | |
| 3 | Neighbor-table |
| | |
| 4 | PLookup |
| | |
| 5 | Resource-object |
| | |
| 6 | Expires |
| | |
| 7 | Request-Options |
| | |
| 8 | Owner |
| | |
| 9 | Credentials |
| | |
| 10 | Uptime |
| | |
| 11 | Unhashed-ID |
| | |
| 12 | Capacity-Info |
| | |
| 13 | Address-Info |
| | |
| 14 | Error |
+-------+-----------------+
Algorithm: There is a one byte algorithm field in the P2P-options
object which defines the hash function being used. The following
values are allocated by this specification for this field.
Baset & Schulzrinne Expires January 3, 2008 [Page 48]
Internet-Draft Peer-to-Peer Protocol July 2007
+-------+-----------+
| AType | Algorithm |
+-------+-----------+
| 0 | None |
| | |
| 1 | SHA1 |
| | |
| 2 | SHA-256 |
| | |
| 3 | SHA-512 |
| | |
| 4 | MD4 |
| | |
| 5 | MD5 |
+-------+-----------+
Algorithm: There is a one byte P2P-algorithm field in the P2P-
options object which defines the p2p algorithm being used. The
following values are allocated by this specification for this
field.
+-------+---------------+
| PType | P2P-Algorithm |
+-------+---------------+
| 0 | Chord |
| | |
| 1 | CAN |
| | |
| 2 | Kademlia |
| | |
| 3 | Pastry |
| | |
| 4 | Bamboo |
| | |
| 5 | Tapestry |
| | |
| 6 | Accordion |
| | |
| 7 | SkipNet |
| | |
| 8 | Mercury |
| | |
| 9 | Gia |
+-------+---------------+
Baset & Schulzrinne Expires January 3, 2008 [Page 49]
Internet-Draft Peer-to-Peer Protocol July 2007
13. Change Log
Insert, Remove, Lookup, Peer-Lookup and Update have been renamed as
Publish, RemoveObject, LookupObject, LookupPeer, and ExchangeTable
respectively.
Transfer request has been added.
Baset & Schulzrinne Expires January 3, 2008 [Page 50]
Internet-Draft Peer-to-Peer Protocol July 2007
14. References
14.1. Normative References
[1] Bradner, S., "Key words for use in RFCs to Indicate Requirement
Levels", BCP 14, RFC 2119, March 1997.
[2] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A.,
Petersen, J., Sparks, R., Handley, M., and E. Schooler, "SIP:
Session Initiation Protocol", RFC 3261, June 2002.
[3] Rosenberg, J. and H. Schulzrinne, "Guidelines for Authors of
Extensions to the Session Initiation Protocol (SIP)", RFC 4485,
May 2006.
[4] Crocker, D. and P. Overell, "Augmented BNF for Syntax
Specifications:ABNF", RFC 4234, October 2005.
[5] Rosenberg, J., Huitema, C., Mahy, R., and D. Wing, "Simple
Traversal Underneath Network Address Translators (NAT) (STUN)",
draft-ietf-behave-rfc3489bis-06 (work in progress),
March 2007.
[6] Rosenberg, J., Mahy, R., and C. Huitema, "Obtaining Relay
Addresses from Simple Traversal Underneath NAT (STUN)",
draft-ietf-behave-turn-03 (work in progress), March 2007.
[7] Rosenberg, J., "Interactive Connectivity Establishment (ICE): A
Methodology for Network Address Translator (NAT) Traversal for
Offer/Answer Protocols", draft-ietf-mmusic-ice-16 (work in
progress), June 2007.
14.2. Informative References
[8] Willis, D., Bryan, D., Matthews, P., and E. Shim, "Concepts and
Terminology for Peer-to-Peer SIP",
draft-willis-p2psip-concepts-04 (work in progress), March 2007.
[9] Bryan, D., Lowekamp, B., and C. Jennings, "dSIP: A P2P Approach
to SIP Registration and Resource Location",
draft-bryan-p2psip-dsip-00 (work in progress), February 2007.
[10] Rhea, S., Godfrey, B., Karp, B., Kubiatowicz, J., Ratnasamy,
S., Shenker, S., Stoica, I., and H. Yu, "OpenDHT: A Public DHT
Service and its Uses", SIGCOMM '05:Proceedings of the 2005
conference on Applications, technologies, architectures, and
protocols for computer communications. Philadelphia, PA,
pp. 73-84, 2005.
Baset & Schulzrinne Expires January 3, 2008 [Page 51]
Internet-Draft Peer-to-Peer Protocol July 2007
[11] Pugh, W., "Skip Lists: A Probabilistic Alternative to Balanced
Trees", Workshop on Algorithms and Data Structures. pp. 437-
449, 1989.
[12] Stoica, I., Morris, R., Liben-Nowell, D., Karger, D., Kaashoek,
M., Dabek, F., and H. Balakrishnan, "Chord: A Scalable Peer-to-
peer Lookup Service for Internet Applications", IEEE/ACM
Transactions on Networking, vol. 11, no. 1, pp. 17-32, 2003.
[13] Ratmasamy, S., Francis, P., Handley, M., Karp, R., and S.
Shenker, "A Scalable Content-Addressable Network", SIGCOMM '01:
Proceedings of the 2001 conference on Applications,
technologies, architectures, and protocols for computer
communications. San Diego, CA, pp. 161-172, August 2001.
[14] Rowstron, A. and P. Druschel, "Pastry: Scalable, distributed
object location and routing for large-scale peer-to-peer
systems", Proceedings of the 18th IFIP/ACM International
Conference on Distributed Systems Platforms (Middleware 2001),
March 2002.
[15] Maymounkov, P. and D. Mazieres, "Kademlia: A Peer-to-Peer
Information System Based on the XOR Metric", IPTPS'01: Revised
Papers from the First International Workshop on Peer-to-Peer
Systems London, UK, pp. 53-65, March 2002.
[16] Karger, D., Lehman, E., Leighton, T., Panigraphy, R., Levine,
F., and D. Lewin, "Consistent hashing and random trees:
distributed caching protocols for relieving hot spots on the
World Wide Web", STOC '97: Proceedings of the twenty-ninth
annual ACM symposium on Theory of computing , 1997.
[17] Balakrishnan, H., Kaashoek, F., Karger, D., Morris, R., and I.
Stoica, "Looking up data in P2P systems", Communications of the
ACM, vol. 46, no. 2, pp. 43-48, 2003.
[18] Dabek, F., Zhao, B., Druschel, P., Kubiatowicz, J., and I.
Stoica, "Towards a Common API for Structured Peer-to-Peer
Overlays", IPTPS'03: Proceedings of the 2nd International
Workshop on Peer-to-Peer Systems. Berkeley, California,
February 2003.
[19] Chawathe, Y., Ratnasamy, S., Breslau, L., Lanham, N., Kaashoek,
M., and S. Shenker, "Making gnutella-like p2p systems
scalable", SIGCOMM '03: Proceedings of the 2003 conference on
Applications, technologies, architectures, and protocols for
computer communications. New York, NY, USA, pp. 407-418, 2003.
Baset & Schulzrinne Expires January 3, 2008 [Page 52]
Internet-Draft Peer-to-Peer Protocol July 2007
[20] Li, J., Stribling, J., Morris, R., and M. Kaashoek, "Bandwidth-
efficient management of DHT routing tables", in Proceedings of
the 2nd USENIX Symposium on Networked Systems Design and
Implementation (NSDI '05). Boston, MA, USA, 2005.
[21] Cooper, E., Johnston, A., and P. Matthews, "Bootstrap
Mechanisms for P2PSIP",
draft-matthews-p2psip-bootstrap-mechanisms-00 (work in
progress), February 2007.
Baset & Schulzrinne Expires January 3, 2008 [Page 53]
Internet-Draft Peer-to-Peer Protocol July 2007
Appendix A. Background
This section gives a background of various structured and
unstructured peer-to-peer algorithms.
A.1. Structured Overlays
A structured peer-to-peer network is formed when links between nodes
follow a certain pattern or structure. Distributed hash tables
(DHTs) [12][13][14][15] are examples of structured peer-to-peer
networks. DHTs share a fundamental function, namely routing a
message to a node responsible for an identifier (key) in O(log_{b}N)
steps using a certain routing metric where N is the number of nodes
in the system and b is the base of the logarithm.
In this section, we give an overview of Chord [12], Pastry [14] and
Kademlia [15]. These algorithms are based on the idea of consistent
hashing [16] i.e., keys are mapped onto nodes by a hash function that
can be resolved by any node in the system via queries to other nodes
and the arrival or departure of a node does not require all keys to
be rehashed. We compare their algorithm-specific and algorithm-
independent details in Table 1 and 2 and describe the commonalities
that exist between them.
A.1.1. Chord
The identifiers or keys in Chord can be logically considered to be
arranged on a circle. Each node in Chord maintains two data
structures, a 'successor list' (neighbor table) which is the list of
peers immediately succeeding the node ID and a 'finger table'
(routing table). The finger table contains the peer-ID and IP
address of nodes halfway around the ID space from the node, a
quarter-of-the-way, an eighth-of-the-way and so forth in a data
structure that resembles a skiplist [11]. A node forwards a query
for a key k to a node in its finger (routing) table with the highest
ID not exceeding k. The skiplist structure ensures that a key can be
found in O(log_{2}N) steps where N is the number of nodes in the
system.
To join a Chord ring, a node contacts any peer in the Chord network
and requests it to lookup its ID. It then inserts itself at the
appropriate position in the Chord network. The predecessors of the
newly joined node must update their successor lists. The newly
joined node should also update its finger table. Successor list is
the only requirement for correctness while finger table is used to
speedup the lookups.
To guard against node failures, Chord sends keep-alives to its
Baset & Schulzrinne Expires January 3, 2008 [Page 54]
Internet-Draft Peer-to-Peer Protocol July 2007
successors and finger table entries and continuously repairs them.
The routing table size is log_{2}N.
Chord suggests two ways for key and data replication. In the first
method, an application replicates data by storing it under two
different Chord keys derived from the data's key. Alternatively, a
Chord node can replicate key/value pair on each of its r successors.
A.1.2. Pastry
Like Chord, the identifiers or keys in Pastry can be logically
considered to be arranged on a circle; however, the routing is done
in a tree-based (prefix-matching) fashion. Each node in Pastry
contains two data structures, a 'leaf-set' and a 'routing table'.
The leaf-set L (neighbor table) contains |L|/2 closest nodes with
numerically smaller identifiers than the node n and |L|/2 closest
nodes with numerically larger identifiers than n and is conceptually
similar to Chord successor list [17]. The routing table contains the
IP address of nodes with no prefix match, b bits prefix match, 2b
prefix match and so on where b is typically 2, 4, 6, 8 etc. The
maximum size of routing table is log_{2^b}N x 2^b. At each step, a
node n tries to route the message to a node that has a longest
sharing prefix than the node n with the sought key. If there is no
such node, the node n routes the message to a node whose shared
prefix is at least as long as n and whose ID is numerically closer to
the key. The expected number of hops is at most log_{2^b}N.
To join the Pastry network, a node contacts any node in the Pastry
network and builds routing tables and leaf sets by obtaining
information from the nodes along the path from bootstrapping node and
the node closest in ID space to itself. When a node gracefully
leaves the network, the leaf-sets of its neighbors are immediately
updated. The routing table information is corrected only on demand.
The routing table of a Pastry node is initialized such that each
entry i with a common prefix p_{i} is closer to the node (in the
network sense) among all other live nodes having a prefix p_{i}.
This technique is commonly known as proximity neighbor selection
(PNS). Pastry performs recursive lookups. However, PNS and
recursive lookups are orthogonal to the Pastry operation.
Pastry replicates data by storing the key/value pair on k nodes with
the numerically closest node IDs to a key [14]. This method is
conceptually similar to Chord's replication of key/value pairs on its
successor list.
Baset & Schulzrinne Expires January 3, 2008 [Page 55]
Internet-Draft Peer-to-Peer Protocol July 2007
A.1.3. Kademlia
Like Chord and Pastry, identifiers in Kademlia can be logically
considered to be arranged on a circle; however the routing is done in
a tree-based (prefix-matching) fashion. Each node in Kademlia
contains a routing table. Kademlia contains only one data structure
i.e. the routing table. Unlike Chord and Pastry, there are no
successor lists or leaf sets although it is possible for a node to
maintain one.
Kademlia uses XOR metric to compute the distance between two
identifiers, i.e., d(x,y)=x XOR y. XOR metric is non-Euclidean and
it offers the triangle property: d(x,y)+d(y,z) >= d(x,z).
Essentially, XOR metric is a prefix matching algorithm which tries to
route a message to a node with the longest matching prefix and the
smallest XOR value for non-prefix bits.
Kademlia maintains up to k entries per routing table row and allows
parallel lookups to all nodes in a row. However, this is not really
a Kademlia specific feature and other DHT algorithms can implement it
by maintaining multiple entries per routing table row. The latest
incarnation of Chord contains more than one finger entry per row
[20].
The routing table size is log_{2}N. The lookup speed can be increased
by considering IDs b bits at a time instead of one bit at a time
which implies increasing the routing table size. By increasing the
routing table size to 2^b x log_{2^b}N x k entries, the number of
lookup hops can be reduced to log_{2^b}N.
Kademlia replicates data by finding k closest nodes to a key and
storing the key/value pair on them. The Kademlia paper suggests a
value of 20 for k.
A.1.4. Bamboo/OpenDHT
Similar to Pastry. Detailed description ToDo.
Baset & Schulzrinne Expires January 3, 2008 [Page 56]
Internet-Draft Peer-to-Peer Protocol July 2007
Key Recursive/ Sequential/ Routing Neighbor
length Iterative Parallel table nodes
name
---------------------------------------------------------------
Chord 160 Both Sequential Finger Successor
table list
Pastry 128 Recursive Sequential Routing Leaf-set
table
Kademlia 160 Iterative Parallel Routing None
table
Table 1. DHT-independent details of Chord, Pastry and Kademlia.
Routing Routing Symmetric Learning
data table node
structure selection
-------------------------------------------------------------
Chord Skip-list Immediately No No (orig. paper)
succeed the but possible.
interval
(can be a
range)
Pastry Tree-like Any node in Yes Yes
the interval
Kademlia Tree-like Any node in Yes Yes
the interval
Table 2. Algorithm specific details of Chord, Pastry and Kademlia.
A.2. DHT Commonalities
Table 1 and 2 list the DHT-independent and DHT-specific aspects of
Chord, Pastry and Kademlia. From the above discussion, and from
these tables, we can think of following commonalities between Chord,
Pastry and Kademlia.
o The flexibility in selecting a node for a routing table row
impacts whether a routing table can be updated with information
from passing lookup requests. This is useful because a node can
learn about other peers in the DHT without explicitly looking for
them and can refresh its routing table as a side effect of lookup
requests. The flexibility is derived from the underlying geometry
of the DHT which the DHT authors might have overlooked. For
example, in Chord a peer, for its ith routing table entry, selects
Baset & Schulzrinne Expires January 3, 2008 [Page 57]
Internet-Draft Peer-to-Peer Protocol July 2007
a node whose ID must immediately exceed the ith row ID. This
restriction is arbitrary and a peer can pick up any node with ID
between i and i+1 row ID.
o Requests such as join and lookup can be sent in an iterative or
recursive manner. The requests can also be sent in a sequential
or parallel manner.
o It is possible to define replication strategies independent of the
underlying DHT algorithms.
o The time to detect whether a routing entry node has failed is
independent of the DHT algorithm being used.
o The choice of hash function and the length of the key are
independent of the routing algorithm.
A.3. Unstructured Overlays
An unstructured peer-to-peer network is formed when links between
peers are formed arbitrarily. Unlike structured peer-to-peer
systems, they do not necessarily provide a routing guarantee of
O(log_{b}N) hops nor they guarantee finding an identifier if it
exists.
A.3.1. Gia
In this section, we give a brief description of Gia [19], an
unstructured peer-to-peer protocol. Gia extends the Gnutella
topology and search algorithms in order to accommodate natural
heterogeniety present in the peer-to-peer systems. Like other
unstructured protocols, it does not guarantee finding an identifier
if it exists. Unlike Chord and Pastry, a Gia node does not have a
separate routing and neighbor table. Each Gia node maintains a
neighbor table (host cache) comprising a list of other Gia nodes
(their IP address, port number, and capacity). Nodes exchange
capacity and congestion information with each other. A Gia node uses
random walks to locate a resource and biases random walks towards
high capacity nodes.
A node Y attempting to join Gia overlay discovers a node already in
the overlay using some bootstrap mechanism and sends it a join
request. The node receiving the join request selects a small number
of high capacity candidate entries in its neighbor table and forwards
the request towards the highest capacity node. Each node receiving
the join request can add Y as its neighbor if the number of its
neighbors is less than some configured maximum. Otherwise, it drops
a neighbor with the highest capacity exceeding Y's capacity. The
Baset & Schulzrinne Expires January 3, 2008 [Page 58]
Internet-Draft Peer-to-Peer Protocol July 2007
rationale behind dropping the highest capacity node is that it is
least likely to suffer from the loss of this neighbor.
In addition to capacity, a Gia nodes takes neighbor nodes' current
congestion state into account before forwarding the request. Nodes
periodically exchange their congestion state information with each
other. A node can be congested if many peers are accessing a
resource or service advertised by this peer.
A node forwards the lookup request to the least congested and highest
capacity node. Each node remembers the ID of the lookup request it
received. The lookup requests are TTL limited.
The pointer to the resource published by a node are replicated on all
of its immediate neighbors.
Baset & Schulzrinne Expires January 3, 2008 [Page 59]
Internet-Draft Peer-to-Peer Protocol July 2007
Appendix B. Protocol design choices
B.1. To SIP or not to SIP
A SIP [2] application can use the P2PP protocol as an alternate
method of locating SIP servers as defined in RFC 3263. There are
several reasons why we did not choose SIP as the underlying peer-to-
peer protocol.
SIP is a session establishment protocol. SIP is a protocol for
initiating, modifying, and terminating interactive sessions [2].
Communicating with other nodes to form and maintain an overlay
does not create an interactive session.
SIP is not a general Remote Procedure Call (RPC). A peer-to-peer
protocol designed on top of SIP will merely use it as a remote
procedure call (RPC) mechanism. The SIP guidelines document [3]
prohibits the use of SIP as a RPC mechanism.
SIP is not a general purpose transfer protocol. One possible way to
design the peer-to-peer protocol is to incorporate it as a SIP
message body, possibly in XML, leaving the SIP headers unchanged.
The peer-to-peer protocol is, however, unrelated to SIP's
operation and the SIP guideline document [3] prohibits sending
large amounts of data unrelated to SIP's operation. Such a
mechanism would use SIP as a RPC, which, as stated earlier, is
prohibited by the SIP guidelines document.
SIP is not a lookup protocol. SIP is not a lookup protocol; it
relies on DNS to locate an appropriate SIP server. Insert and
lookup functionality is essential for any peer-to-peer protocol.
Using SIP as a peer-to-peer protocol requires integrating lookup
functionality into SIP which goes against its design philosophy.
SIP headers overhead. SIP has headers that are not necessarily
needed for a peer-to-peer protocol. Examples of such headers are
Call-ID, and Contact.
B.2. To ASCII or not to ASCII
Perhaps, the first question facing the designer of a new protocol is
whether it should be ASCII or binary based. DHTs are a primary
motivation for this specification and a message in DHT-based overlay
is likely to carry the hash identifier of a peer or resource-object.
Using an ASCII-based protocol will require converting binary hash
identifier to ASCII and vice versa. This conversion can be avoided
if the underlying peer-to-peer protocol is binary based.
Baset & Schulzrinne Expires January 3, 2008 [Page 60]
Internet-Draft Peer-to-Peer Protocol July 2007
Also, if the protocol were to be ASCII-based, existing ASCII-based
protocols such as XML-RPC could have been used.
Baset & Schulzrinne Expires January 3, 2008 [Page 61]
Internet-Draft Peer-to-Peer Protocol July 2007
Appendix C. Examples
C.1. Join (Pastry)
Consider a Pastry-based overlay below in which node P9 is attempting
to join. It will be inserted between nodes P8 and P11. Recall that
in Pastry, requests are forwarded in a recursive fashion. Using some
bootstrap mechanism outside the scope of this specification, it
discovers node P6 which is already in the overlay. It sends a Query
request to node P6 inquiring about the overlay parameters such as
p2p-algorithm and hash-algorithm. It then sends a join request over
UDP to P6. Node P6 forwards the join request in a recursive manner
till it reaches node P8. P8 decides that P9 will be inserted
immediately after itself in the overlay. It replies with a copy of
its neighbor and routing tables in a 200 (Ok) response. Node P9
eventually receives the response and checks the received neighbor
table which contains a pointer to node P11. The nodes in the
neighbor table will be the neighbors of P9. Node P9 then sends a
Join request to node P11 with S flag set to P11. Node P11 receives
the join request with S flag set and knows that the join request
should not be forwarded and that a neighbor update has been
requested. It then update its left neighbor as P9 instead of P8.
Note that neighbors P8 and P11 do not immediately remove overlay
links to each other. Rather, they wait for a random time and
exchange their neighbor tables with each other using the
ExchangeTable request. Once both P8 and P11 know that their right
and left neighbor links, respectively, have been updated, they choose
to remove the link to each other.
+--+ +--+ +--+ +---+ +---+ +---+
|P9| |P6| |P8| |P11| |P15| |P20|
+--+ +--+ +--+ +---+ +---+ +---+
(1) Query
|---------->|
|(2) 200 |
|<----------|
| | |
|(3) Join |
|---------->| | |
| |(4) Join | |
| |---------->| |
| |(5) 200 | |
| |<----------| |
|(6) 200 | N(P11) | |
|<----------| R(P15,P20) |
| N(P11) |
Baset & Schulzrinne Expires January 3, 2008 [Page 62]
Internet-Draft Peer-to-Peer Protocol July 2007
| R(P15,P20) |
| |
|(7) Join(S=1) |
|------------------------------------------>|
|(8) 200 N(P8,P15) R(P20, P25) |
|<------------------------------------------|
|(9) Update |
| R(P11,P20) |
|<-----------|
|(10) 200 |
|----------->|
|(11) Update |
|<--------------------|
| N(P9,P15)
|(12) 200 |
| N(P6,P9)
|-------------------->|
(1) P9 -> P6 (Query)
P2PP(Header(Msg-type=Request; Request-type=Query; TTL=1;
Trans-Id=0xFDE89F20) )
(2) P6 -> P9 (200 (Ok))
P2PP(Header(Msg-type=Response; Response-code=200; Request-type=Query;
TTL=1; Trans-Id=0xFDE89F20)
Peer-Info(Peer-ID=P6#ID; Uptime=0x000000D0F9; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P6#IP)
P2P-Options(Recursive-routing=1; Algorithm=SHA1;
Algorithm-Length=160; P2P-Algorithm=Pastry;
Overlay-ID="Pastry-overlay")
)
(3) P9 -> P6 (Join) (4) P6 -> P8 (Join) (TTL=159)
P2PP(Header(Msg-type=Request; Request-type=Join; TTL=160;
Trans-Id=0xD59A3BA1)
Request-Options(Request-forwarding(F)=Recursive; Insert-on-join=1;
P=0; Request-routing-table=1;
Request-neighbor-table=0; S=0)
Peer-Info(Peer-ID=P9#ID; Uptime=0x00000000; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P9#IP)
Overlay-ID=("Pastry-overlay")
)
(5) P8 -> P6 (200 (Ok)) (6) P8 -> P9 (200 (Ok))
P2PP(Header(Msg-type=Response; Response-code=200; Request-type=Join;
TTL=159; Trans-Id=0xD59A3BA1)
Peer-Info(Peer-ID=P8#ID; Uptime=0x00000FD21; IP-Ver=4; Num=1;
Baset & Schulzrinne Expires January 3, 2008 [Page 63]
Internet-Draft Peer-to-Peer Protocol July 2007
HT=host; Port=7080; Peer-address=P8#IP)
Neighbor-table(Num=1; Peer-Info(Peer-ID=P11#ID; Uptime=0x00102A5C;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P11#IP))
Routing-table(Num=2; Peer-Info(PeerID=P15#ID; Uptime=0x000000AB;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P15#IP)
Peer-Info(PeerID=P20#ID; Uptime=0x00000EC4;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P20#IP)
)
(7) P9 -> P11 (Join)
P2PP(Header(Msg-type=Request; Request-type=Join; TTL=1;
Trans-Id=0xFA4A3C45)
Request-Options(Request-forwarding(F)=Recursive; Insert-on-join=1;
P=0; Request-routing-table=1;
Request-neighbor-table=0; S=1)
Peer-Info(Peer-ID=P9#ID; Uptime=0x00000000; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P9#IP)
Overlay-ID=("Pastry-overlay"))
(8) 200 (Ok)
P2PP(Header(Msg-type=Response; Response-code=200; Request-type=Join;
TTL=0; Trans-Id=0xFA4A3C45)
Peer-Info(Peer-ID=P11#ID; Uptime=0x00102A5C; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P11#IP))
Neighbor-table(Num=2; Peer-Info(Peer-ID=P8#ID; Uptime=0x00000FD21;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P8#IP)
Peer-Info(PeerID=P15#ID; Uptime=0x000000AB;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P15#IP))
Routing-table(Num=2; Peer-Info(PeerID=P20#ID; Uptime=0x00000EC4;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P20#IP)
Peer-Info(PeerID=P25#ID; Uptime=0x0000015A;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P25#IP))
)
(9) P6 -> P9 (Update)
P2PP(Header(Msg-type=Request; Request-type=Update; TTL=1;
Trans-Id=0x0183FA78)
Peer-Info(Peer-ID=P6#ID; Uptime=0x000000D0FA; IP-Ver=4;
Num=1; HT=host; Port=7080; Peer-address=P6#IP)
Routing-table(Num=2; Peer-Info(Peer-ID=P11#ID; Uptime=0x00102A5E;
Baset & Schulzrinne Expires January 3, 2008 [Page 64]
Internet-Draft Peer-to-Peer Protocol July 2007
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P11#IP)
Peer-Info(PeerID=P20#ID; Uptime=0x00000EC7;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P20#IP)
)
(10) P9 -> P6 (200 (Ok))
P2PP(Header(Msg-type=Request; Response-code=200; Request-type=Update;
TTL=1; Trans-Id=0x0183FA78)
Peer-Info(Peer-ID=P9#ID; Uptime=0x00000003; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P9#IP)
)
(11) P11 -> P8 (Update)
P2PP(Header(Msg-type=Request; Request-type=Update; TTL=1;
Trans-Id=0x2154A526)
Request-Options(Request-forwarding(F)=Recursive; Insert-on-join=0;
P=0; Request-routing-table=0;
Request-neighbor-table=1; S=1)
Peer-Info(Peer-ID=P11#ID; Uptime=0x00102A60; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P11#IP))
Neighbor-table(Num=2; Peer-Info(Peer-ID=P9#ID; Uptime=0x00000001;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P9#IP)
Peer-Info(PeerID=P15#ID; Uptime=0x000000AB;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P15#IP)
)
(12) P8 -> P11 (200)
P2PP(Header(Msg-type=Request; Response-code=200; Request-type=Update;
TTL=0; Trans-Id=0x2154A526)
Peer-Info(Peer-ID=P8#ID; Uptime=0x00000FD24; IP-Ver=4; Num=1;
HT=host; Port=7080; Peer-address=P8#IP)
Neighbor-table(Num=2; Peer-Info(Peer-ID=P6#ID; Uptime=0x000000D0F9;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P6#IP)
Peer-Info(Peer-ID=P9#ID; Uptime=0x00000001;
IP-Ver=4; Num=1; HT=host; Port=7080;
Peer-address=P9#IP)
)
C.2. Join (Gia)
Baset & Schulzrinne Expires January 3, 2008 [Page 65]
Internet-Draft Peer-to-Peer Protocol July 2007
+--+ +--+ +--+ +---+ +---+ +---+
|P9| |P6| |P8| |P11| |P15| |P20|
+--+ +--+ +--+ +---+ +---+ +---+
(1) Query
|---------->|
|(2) 200 |
|<----------|
| | |
|(3) Join |
|---------->| | |
| |(4) Join | |
| |---------->| |
| |(5) 200 | |
| |<----------| |
|(6) 200 |N(P11,P20) | |
|<----------| |
| N(P11,P20) |
| |
| |
|(7) Join(S=1) |
|------------------------------------------>|
|(8) 200 N(P8,P15) |
|<------------------------------------------|
|(9) Update |
| N(P11,P20) |
|<-----------|
|(10) 200 |
|----------->|
|(11) Update |
|<--------------------|
| N(P9,P15)
|(12) 200 |
| N(P6,P9)
|-------------------->|
C.3. Join (Chord)
TBD.
C.4. Lookup (Pastry)
TBD.
Baset & Schulzrinne Expires January 3, 2008 [Page 66]
Internet-Draft Peer-to-Peer Protocol July 2007
C.5. Lookup (Gia)
TBD.
C.6. Lookup (Chord)
TBD.
Baset & Schulzrinne Expires January 3, 2008 [Page 67]
Internet-Draft Peer-to-Peer Protocol July 2007
Authors' Addresses
Salman A. Baset
Dept. of Computer Science
Columbia University
1214 Amsterdam Avenue
New York, NY 10027
USA
Email: salman@cs.columbia.edu
Henning Schulzrinne
Dept. of Computer Science
Columbia University
1214 Amsterdam Avenue
New York, NY 10027
USA
Email: hgs@cs.columbia.edu
Baset & Schulzrinne Expires January 3, 2008 [Page 68]
Internet-Draft Peer-to-Peer Protocol July 2007
Full Copyright Statement
Copyright (C) The IETF Trust (2007).
This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.
This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Intellectual Property
The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at
ietf-ipr@ietf.org.
Acknowledgment
Funding for the RFC Editor function is provided by the IETF
Administrative Support Activity (IASA).
Baset & Schulzrinne Expires January 3, 2008 [Page 69]
| PAFTECH AB 2003-2026 | 2026-04-23 15:31:36 |