Network Working Group                                           S. Baset
Internet-Draft                                            H. Schulzrinne
Intended status: Standards Track                     Columbia University
Expires: May 22, 2008                                     M. Matuszewski
                                                                   Nokia
                                                       November 19, 2007


                      Peer-to-Peer Protocol (P2PP)
                       draft-baset-p2psip-p2pp-01

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 May 22, 2008.

Copyright Notice

   Copyright (C) The IETF Trust (2007).












Baset, et al.             Expires May 22, 2008                  [Page 1]


Internet-Draft            Peer-to-Peer Protocol            November 2007


Abstract

   This document defines the Peer-to-Peer Protocol (P2PP), an
   application-layer binary 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
   Bamboo, Chord, Pastry, Kademlia, Gnutella, and Gia. P2PP uses a
   secure transport, supports an application API, has mechanisms for NAT
   and firewall traversal, exchanging node capabilities, and diagnostic
   information.  P2PP is designed to support a P2P Session Initiation
   Protocol (SIP) network, but it can be used for other applications as
   well.


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  6
   2.  Terminology  . . . . . . . . . . . . . . . . . . . . . . . . .  7
   3.  Design Overview  . . . . . . . . . . . . . . . . . . . . . . . 10
     3.1.  High-Level Requirements  . . . . . . . . . . . . . . . . . 10
     3.2.  Node Model . . . . . . . . . . . . . . . . . . . . . . . . 10
       3.2.1.  P2PP Node Stack  . . . . . . . . . . . . . . . . . . . 12
     3.3.  Data Model . . . . . . . . . . . . . . . . . . . . . . . . 14
     3.4.  Message Model  . . . . . . . . . . . . . . . . . . . . . . 15
     3.5.  Reliability Model  . . . . . . . . . . . . . . . . . . . . 16
     3.6.  Security Model . . . . . . . . . . . . . . . . . . . . . . 18
       3.6.1.  Threat Model . . . . . . . . . . . . . . . . . . . . . 19
     3.7.  NAT and Firewall Traversal . . . . . . . . . . . . . . . . 20
     3.8.  Mobility . . . . . . . . . . . . . . . . . . . . . . . . . 20
       3.8.1.  Peer Mobility  . . . . . . . . . . . . . . . . . . . . 20
       3.8.2.  Client Mobility  . . . . . . . . . . . . . . . . . . . 21
       3.8.3.  Session Mobility . . . . . . . . . . . . . . . . . . . 22
     3.9.  Overview of Operations . . . . . . . . . . . . . . . . . . 22
       3.9.1.  Enrollment, Authentication, and Bootstrap  . . . . . . 22
       3.9.2.  Overlay Maintenance  . . . . . . . . . . . . . . . . . 23
       3.9.3.  Data Storage and Retrieval . . . . . . . . . . . . . . 24
       3.9.4.  Connection Management and Other  . . . . . . . . . . . 24
     3.10. Overlay Migration  . . . . . . . . . . . . . . . . . . . . 25
   4.  Overlay Layer  . . . . . . . . . . . . . . . . . . . . . . . . 26
     4.1.  Peer State . . . . . . . . . . . . . . . . . . . . . . . . 26
     4.2.  Key Components of a P2PP Message . . . . . . . . . . . . . 27
     4.3.  Request, Response, and Indications Processing  . . . . . . 29
       4.3.1.  ACK generation . . . . . . . . . . . . . . . . . . . . 32
       4.3.2.  Recursive and Iterative Routing  . . . . . . . . . . . 33
     4.4.  Message Encoding Guidelines  . . . . . . . . . . . . . . . 35
     4.5.  Enrollment and Authentication  . . . . . . . . . . . . . . 36
       4.5.1.  HTTP Digest Authentication . . . . . . . . . . . . . . 37
       4.5.2.  Authentication without a Central Authority . . . . . . 38



Baset, et al.             Expires May 22, 2008                  [Page 2]


Internet-Draft            Peer-to-Peer Protocol            November 2007


     4.6.  Bootstrap  . . . . . . . . . . . . . . . . . . . . . . . . 38
     4.7.  Joining, Leaving . . . . . . . . . . . . . . . . . . . . . 38
       4.7.1.  Join . . . . . . . . . . . . . . . . . . . . . . . . . 39
       4.7.2.  Leave  . . . . . . . . . . . . . . . . . . . . . . . . 41
     4.8.  Publish, LookupObject, LookupPeer  . . . . . . . . . . . . 42
       4.8.1.  Publish  . . . . . . . . . . . . . . . . . . . . . . . 42
       4.8.2.  LookupObject . . . . . . . . . . . . . . . . . . . . . 42
       4.8.3.  LookupPeer . . . . . . . . . . . . . . . . . . . . . . 43
     4.9.  Maintenance  . . . . . . . . . . . . . . . . . . . . . . . 43
       4.9.1.  Node Timers  . . . . . . . . . . . . . . . . . . . . . 44
     4.10. Replication  . . . . . . . . . . . . . . . . . . . . . . . 44
     4.11. Capabilities and Diagnostics . . . . . . . . . . . . . . . 45
   5.  P2PP Processing  . . . . . . . . . . . . . . . . . . . . . . . 46
     5.1.  Resources and Services . . . . . . . . . . . . . . . . . . 46
     5.2.  NAT Traversal  . . . . . . . . . . . . . . . . . . . . . . 47
       5.2.1.  NAT Traversal Service Advertisement and Discovery  . . 48
       5.2.2.  Gathering of Candidates and NAT Behavior Discovery . . 48
       5.2.3.  Communicating with a Peer Behind a NAT . . . . . . . . 48
       5.2.4.  Maintenance of NAT Bindings  . . . . . . . . . . . . . 49
       5.2.5.  Load Balancing for Media Flows . . . . . . . . . . . . 49
       5.2.6.  ICE Overhead . . . . . . . . . . . . . . . . . . . . . 49
     5.3.  Route Log  . . . . . . . . . . . . . . . . . . . . . . . . 50
     5.4.  P2PP and SIP . . . . . . . . . . . . . . . . . . . . . . . 50
   6.  Transport Layer  . . . . . . . . . . . . . . . . . . . . . . . 51
     6.1.  Transaction Identifier . . . . . . . . . . . . . . . . . . 51
     6.2.  Message State Machine  . . . . . . . . . . . . . . . . . . 51
       6.2.1.  State Machine for Unreliable Transports  . . . . . . . 51
       6.2.2.  State Machine for Reliable Transports  . . . . . . . . 53
     6.3.  Timers . . . . . . . . . . . . . . . . . . . . . . . . . . 55
   7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 56
     7.1.  Routing Security . . . . . . . . . . . . . . . . . . . . . 56
       7.1.1.  Peer-ID Assignment . . . . . . . . . . . . . . . . . . 56
       7.1.2.  Message Forwarding and Message Integrity . . . . . . . 56
       7.1.3.  Routing and Neighbor Table Management  . . . . . . . . 56
       7.1.4.  Admission Control  . . . . . . . . . . . . . . . . . . 56
       7.1.5.  Residual Attacks . . . . . . . . . . . . . . . . . . . 57
     7.2.  Storage Security . . . . . . . . . . . . . . . . . . . . . 57
       7.2.1.  Integrity  . . . . . . . . . . . . . . . . . . . . . . 57
       7.2.2.  Permissions  . . . . . . . . . . . . . . . . . . . . . 57
       7.2.3.  Quota  . . . . . . . . . . . . . . . . . . . . . . . . 57
       7.2.4.  Residual Attacks . . . . . . . . . . . . . . . . . . . 57
   8.  Message Formats  . . . . . . . . . . . . . . . . . . . . . . . 58
     8.1.  Enroll . . . . . . . . . . . . . . . . . . . . . . . . . . 58
     8.2.  Authenticate . . . . . . . . . . . . . . . . . . . . . . . 58
     8.3.  Bootstrap  . . . . . . . . . . . . . . . . . . . . . . . . 59
     8.4.  Join . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
     8.5.  Leave  . . . . . . . . . . . . . . . . . . . . . . . . . . 60
     8.6.  KeepAlive  . . . . . . . . . . . . . . . . . . . . . . . . 60



Baset, et al.             Expires May 22, 2008                  [Page 3]


Internet-Draft            Peer-to-Peer Protocol            November 2007


     8.7.  LookupPeer . . . . . . . . . . . . . . . . . . . . . . . . 60
     8.8.  ExchangeTable  . . . . . . . . . . . . . . . . . . . . . . 61
     8.9.  Query  . . . . . . . . . . . . . . . . . . . . . . . . . . 61
     8.10. Replicate  . . . . . . . . . . . . . . . . . . . . . . . . 61
     8.11. Transfer . . . . . . . . . . . . . . . . . . . . . . . . . 62
     8.12. PublishObject  . . . . . . . . . . . . . . . . . . . . . . 62
     8.13. LookupObject . . . . . . . . . . . . . . . . . . . . . . . 62
     8.14. RemoveObject . . . . . . . . . . . . . . . . . . . . . . . 63
     8.15. Tunnel . . . . . . . . . . . . . . . . . . . . . . . . . . 63
     8.16. Connect  . . . . . . . . . . . . . . . . . . . . . . . . . 63
     8.17. Invite . . . . . . . . . . . . . . . . . . . . . . . . . . 63
   9.  Packet Formats . . . . . . . . . . . . . . . . . . . . . . . . 65
     9.1.  Common Header  . . . . . . . . . . . . . . . . . . . . . . 65
     9.2.  General Object Format  . . . . . . . . . . . . . . . . . . 67
     9.3.  P2PP TLV Objects . . . . . . . . . . . . . . . . . . . . . 67
       9.3.1.  Peer-Info  . . . . . . . . . . . . . . . . . . . . . . 67
       9.3.2.  Unhashed-Id  . . . . . . . . . . . . . . . . . . . . . 69
       9.3.3.  Request-Options  . . . . . . . . . . . . . . . . . . . 69
       9.3.4.  P2P-Options  . . . . . . . . . . . . . . . . . . . . . 71
       9.3.5.  Routing-Table  . . . . . . . . . . . . . . . . . . . . 71
       9.3.6.  Neighbor-table . . . . . . . . . . . . . . . . . . . . 72
       9.3.7.  PLookup  . . . . . . . . . . . . . . . . . . . . . . . 72
       9.3.8.  Resource-ID  . . . . . . . . . . . . . . . . . . . . . 73
       9.3.9.  RLookup  . . . . . . . . . . . . . . . . . . . . . . . 73
       9.3.10. Resource-Object  . . . . . . . . . . . . . . . . . . . 74
       9.3.11. Expires  . . . . . . . . . . . . . . . . . . . . . . . 75
       9.3.12. Owner  . . . . . . . . . . . . . . . . . . . . . . . . 75
       9.3.13. Certificate  . . . . . . . . . . . . . . . . . . . . . 76
       9.3.14. Signature  . . . . . . . . . . . . . . . . . . . . . . 76
       9.3.15. Capabilities and Diagnostics . . . . . . . . . . . . . 76
     9.4.  Response Codes and Errors  . . . . . . . . . . . . . . . . 78
       9.4.1.  Response Codes . . . . . . . . . . . . . . . . . . . . 78
       9.4.2.  Error Object . . . . . . . . . . . . . . . . . . . . . 79
   10. Application Layer  . . . . . . . . . . . . . . . . . . . . . . 80
     10.1. Query  . . . . . . . . . . . . . . . . . . . . . . . . . . 80
     10.2. Join . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
     10.3. Leave  . . . . . . . . . . . . . . . . . . . . . . . . . . 80
     10.4. Publish  . . . . . . . . . . . . . . . . . . . . . . . . . 80
     10.5. Remove . . . . . . . . . . . . . . . . . . . . . . . . . . 80
     10.6. Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 81
   11. Open Issues  . . . . . . . . . . . . . . . . . . . . . . . . . 82
   12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 83
   13. IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 84
   14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 89
     14.1. Normative References . . . . . . . . . . . . . . . . . . . 89
     14.2. Informative References . . . . . . . . . . . . . . . . . . 89
   Appendix A.  Background  . . . . . . . . . . . . . . . . . . . . . 92
   Appendix B.  Message Flow  . . . . . . . . . . . . . . . . . . . . 93



Baset, et al.             Expires May 22, 2008                  [Page 4]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 94
   Intellectual Property and Copyright Statements . . . . . . . . . . 95

















































Baset, et al.             Expires May 22, 2008                  [Page 5]


Internet-Draft            Peer-to-Peer Protocol            November 2007


1.  Introduction

   This document defines Peer-to-Peer Protocol (P2PP) for creating and
   maintaining an overlay of participant nodes.  The design of P2PP
   exploits commonalities in the peer-to-peer (p2p) protocols such as
   Bamboo [22] 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.  P2PP defines mechanisms for
   NAT and firewall traversal, uses a secure transport, and has
   mechanisms for exchanging node capabilities and diagnostic
   information.  P2PP allows non-participant nodes to use overlay
   services through participant nodes.






































Baset, et al.             Expires May 22, 2008                  [Page 6]


Internet-Draft            Peer-to-Peer Protocol            November 2007


2.  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].

   User:  A human user running the P2PP application and is identified by
      a user-ID.

   User Identifier (User-ID):  A user identifier is an information that
      represents a user in the overlay.

   Node:  A node is an entity that runs an overlay protocol (peer) or
      can access the services provided by an overlay network (client).

   Peer:  A peer is a node participating in an overlay that provides
      storage and routing services to other nodes in the overlay [8].

   Client:  A client is a node participating in an overlay that provides
      neither routing nor storage and retrieval functions [8].

   Peer Protocol:  A structured or unstructured protocol such as Chord,
      Kademlia, Pastry, Gia.

   Joining Peer (JP):  The peer which intends to join the overlay
      network.

   Admitting Peer (AP):  An admitting peer is a peer that receives a
      join request from a joining peer.

   Identifier (ID):  An identifier is 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.

   Peer-ID:  A Peer-ID is information that uniquely identifies a peer
      within a given overlay [8].  In DHT-based overlays, this is a hash
      of a unique node identifier such as an IP address.  In
      unstructured overlays, this is typically an unhashed unique
      identifier.

   Routing Table:  A routing table (known as finger table in Chord) is
      used by a peer to locate a peer or a resource-object.  Peers in a
      DHT-based overlay contain a routing table which is a list of
      overlay peer-IDs and their IP addresses stored against identifiers



Baset, et al.             Expires May 22, 2008                  [Page 7]


Internet-Draft            Peer-to-Peer Protocol            November 2007


      that are exponentially away from the peer's identifier and thus
      has a particular structure.  The routing-table size is
      algorithmically bounded.  In unstructured networks, peers 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.

   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
      (known as successor list in Chord and leaf-set in Pastry) contains
      a list of overlay peer-IDs and their IP addresses which are
      'immediately' close to the node's identifier according to the DHT
      metric.  The purpose of the neighbor table is to maintain
      correctness.  In an unstructured overlay, nodes typically only
      maintain a routing table.

   Neighbor Peers:  The list of peers stored in a neighbor table are
      called neighbor peers.

   Resource Object:  A resource-object is a blob of data stored in the
      overlay and is identified by a resource-ID.  Examples of resource-
      objects are SIP URIs, routing-records, file-names, and service
      identifiers such as those identifying STUN or TURN servers.  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 defined by the user.  Resource Object is known as resource
      record in the concepts document [8].

   Service:  A node can offer services such as NAT and firewall
      traversal and may relay traffic for other nodes.  A node
      advertises its service capabilities in the overlay using a
      resource-object.  Different nodes can advertise the same service.
      The nodes store service advertisements as resource-objects in the
      overlay.

   Heterogeneous Network Environments:  A heterogeneous network
      environment comprises of nodes that use different mechanisms for
      network connectivity such as dialup, DSL, or wireless.

   Overlay Operator:  An entity that uses P2PP to implement an overlay.






Baset, et al.             Expires May 22, 2008                  [Page 8]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Enrollment and Authentication Server:  An entity which enrolls and
      authenticates a user.

   Bootstrap Server:  An entity which provides an IP address and port
      number of an existing node in the overlay to the joining peers.

   Diagnostic Server:  An entity which gathers diagnostic information
      from peers in the overlay.  This information can be used to
      construct a geographical map of the overlay to visually identify
      load hotspots in the overlay.









































Baset, et al.             Expires May 22, 2008                  [Page 9]


Internet-Draft            Peer-to-Peer Protocol            November 2007


3.  Design Overview

3.1.  High-Level Requirements

   There are five high-level requirements for a peer protocol.

   Overlay formation  The protocol should allow nodes to form an overlay
      using well-known structured or unstructured peer-to-peer
      protocols.

   Overlay maintenance:  The protocol should provide mechanisms to
      maintain connectivity and resource availability in an overlay.

   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.

   Heterogeneous capabilities and connectivity:  The protocol should
      allow nodes with heterogeneous capabilities and connectivity (such
      as NATs) to form an overlay.

   Security  The protocol should provide mechanisms to protect against
      well-known threats against overlays.

3.2.  Node Model

   P2PP is an application layer protocol that allows participating nodes
   to form an overlay using a structured or unstructured peer protocol.
   The participating nodes typically represent a human user.  There is a
   one-to-many relationship between the human user and the nodes, i.e.,
   a user can participate in the overlay through one or multiple nodes.
   P2PP defines two types of nodes, namely, peers and clients.  A peer
   is a node participating in an overlay that provides storage and
   routing services to other nodes in the overlay.  A client is a node
   that does not participate in the overlay and hence does not provide
   any storage or routing services.  Instead, it communicates with one
   or more peers to make use of the storage and routing services
   provided by peers.  A peer can participate in more than one overlay
   and a client can also communicate with peers in different overlays.











Baset, et al.             Expires May 22, 2008                 [Page 10]


Internet-Draft            Peer-to-Peer Protocol            November 2007


              User
             / | \
           /   |   \
         /     |     \
       /       |       \
   +-----+  +-----+  +-------+
   |Peer1|  |Peer2|  |Client1|
   +-----+  +-----+  +-------+

   Figure 1: Relationship between user, peers and clients.

   P2PP does not define a priori which nodes can act as peers or clients
   and leaves the decision to overlay operator.  The rationale is that
   P2PP can be used to form an overlay of participating nodes in many
   different network environments.  These include Internet, a
   corporation, a small office, mobile networks and so on.  Nodes which
   are suitable candidates for becoming a peer in one environment may
   not necessarily be suitable in other environment.  CPU, memory,
   uptime and network connectivity are some issues which determine
   whether the node can act as a peer or a client.

   The classification of a node as a peer or a client is not permanent;
   a client can join the overlay as a peer or a peer can invite a client
   to join the overlay.  Similarly, a peer can leave the overlay and
   join as a client.

   In P2PP, peers and clients are identified by a fixed length
   identifier and are chosen from the same identifier space.  To some
   extent, the identifier assignment depends on the underlying peer
   protocol.  For structured protocols such as DHTs, a peer and a client
   identifier is a randomly chosen identifier whose length depends on
   the underlying hash function.  For unstructured protocols, the
   identifier can be chosen in an appropriate way.  Peers and clients
   can choose their own identifiers or have a central authority choose
   their identifiers.  The human users are identified by an identifier
   such as SIP AOR or an email address.  The user identifiers are chosen
   in a distributed fashion and may or may not be managed by a central
   authority.

   The lack of central management authority for choosing a user
   identifier implies that two users can potentially select the same
   user identifier.  Likewise, the possibility of collision also arises
   if peers and clients were to choose their own identifiers.  Further,
   lack of a central authority on user and node identifier assignment
   opens the system to Sybil attack [23].  To address these issues, P2PP
   defines an entity called an enrollment and authentication (E&A)
   server.  The E&A server authenticates the users, and ensures that
   user and node identifiers are unique.  A peer can act as an E&A



Baset, et al.             Expires May 22, 2008                 [Page 11]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   server.

   Bootstraping is a fundamental issue in the overlay as the peers must
   somehow discover the address of other peers in the overlay.
   Similarly, clients also need to discover the address of one or more
   peers in the overlay.  There are different mechanisms for discovering
   a peer already in the overlay [21].  P2PP describes a bootstrap
   server based mechanism, and defines an entity, called bootstrap
   server.  The bootstrap server provides the peers and clients with the
   IP address of participating peers.  The bootstrap server may be co-
   located with the E&A server.  A peer can also act as a bootstrap
   server.

   For diagnostic purposes, an overlay operator may like to construct a
   'map' of nodes.  This allows the overlay operator to identify
   problematic hotspots in the overlay and take remedial actions.  P2PP,
   defines an entity called diagnostic server, which crawls the overlay
   and gathers diagnostic information.

   Purists can argue that the use of enrollment and authentication
   server, bootstrap server, and diagnostic server violates the
   distributed nature of the overlay.  We do not disagree with the
   argument and note that an overlay operator may dispense with these
   entities provided it is aware of the issues that may arise as a
   consequence.  From our experience, we think that the practical issues
   involved in running an overlay necessitate their usage.

   P2PP allows peers to provide services such as NAT traversal.  Many
   peers can provide the same service.  Besides storage and routing,
   P2PP also allows clients to provide services.  Besides, peers and
   clients can store and retrieve data from the overlay.

   P2PP represents both clients and peers by a peer-info object.

3.2.1.  P2PP Node Stack

   The protocol stack of a P2PP node comprises of three conceptual
   layers, namely, application, overlay, and transport layers.  Figure 2
   shows the three layers.












Baset, et al.             Expires May 22, 2008                 [Page 12]


Internet-Draft            Peer-to-Peer Protocol            November 2007


            ^
            |
            |
        Application         +------------+     +-----------+
          Layer             |SIP Proxy/UA|     |Application|
            |               +------------+     +-----------+
            V                      |                 |
                   ================|=================|========= P2PP API
                                   |                 |
            ^            +---------------------+--------------+
            |            |    routing          |   routing    |
         Overlay         |    maintenance      |    state     |
          Layer          |    replication      +--------------|
            |            |    NAT traversal    |  resource    |
            |            |    storage          |   objects    |
            V            +---------------------+--------------+
                                   |        |        |
            ^                 +---------------------------+
            |                 |  -state-machine for       |
            |                 |  reliable and unreliable  |
            |                 |  transports               |
            |                 +---------------------------+
        Transport                  |        |        |
          Layer         ..........................................
            |           . Transport Layer Security (TLS or DTLS) .
            |           ..........................................
            |                      |        |
            |                   +-----+  +-----+
            |                   | UDP |  | TCP |  ... other
            |                   +-----+  +-----+      protocols
            |                      |        |
            |                .............................
            |                .     IP Layer Security     .
            |                .............................
            V                      |        |        |
  =================================|========|========|=============
                                   |        |        |
                          +------------------------------------+
                          |                IP                  |
                          +------------------------------------+

   Figure 2: Protocol stack of a P2PP peer.

3.2.1.1.  Application Layer

   The application layer defines an asynchronous application-level API.
   An application can issue these API to the overlay layer to accomplish
   functions such as joining or leaving an overlay, and to search for



Baset, et al.             Expires May 22, 2008                 [Page 13]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   another peer or resource-object in the overlay.

3.2.1.2.  Overlay Layer

   The overlay layer is the 'brain' of P2PP protocol stack.  It has
   mechanisms for routing, overlay maintenance, replication, NAT
   traversal, and storage management.  The overlay layer receives API
   requests from the usage layer and accomplishes the requested
   function.  The routing mechanism routes the requests in a recursive,
   iterative, or parallel manner.  The overlay maintenance mechanism
   strives to preserve routing correctness and connectivity in the
   presence of churn.  The replication mechanism maintains availability
   of resource-objects in the system.  The NAT traversal mechanism uses
   ICE (TODO: and variants?) to traverse NATs.  The client does not have
   routing, storage, or replication mechanisms.  (TODO: split the
   layer?)

3.2.1.3.  Transport Layer

   P2PP allows sending messages over an unreliable or a reliable
   transport.  It, however, prefers the use of reliable transport such
   as TCP or TLS.  For unreliable transports such as UDP and DTLS, it
   provides an ACK-based hop-by-hop reliability mechanism.  For reliable
   transports, reliability is provided by the underlying transport
   protocol.

3.2.1.3.1.  Listening Ports

   The specification proposes a standard UDP and TCP listening port to
   be assigned by IANA.  The current implementation uses port 7080 as a
   listening port for UDP and TCP, and 7081 for DLTS and TLS.

3.3.  Data Model

   The peers in P2PP provide storage services.  This allows other peers
   and clients to store data on a peer or a set of peers.  In P2PP, the
   data to be stored is defined as a resource-object.  A resource-object
   has a resource-ID which acts as the object locator.  For structured
   overlays such as DHTs, resource-ID is a fixed length identifier.  For
   unstructured overlays, resource-ID can have a variable length.  A
   resource-object has a type and sub-type which identify the
   information being stored.  The type and sub-type define a name-space,
   i.e., resource-objects having same resource-ID but a different type
   and sub-type belong to a different namespace.  An example of a type
   is a user or a service identifier.  Each resource-object has a
   'value' whose description depends on the type and sub-type.  The
   relationship between resource-ID, type, sub-type, and value is shown
   in Figure 3.



Baset, et al.             Expires May 22, 2008                 [Page 14]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Each resource-object has certain properties, namely, the owner of the
   object, the node storing the object and the cryptographic signature
   of the object.  P2PP allows peers to store data having the same
   resource-ID, type and sub-type but different owners.  Similarly, P2PP
   allows nodes to search for resource-objects published by different
   owners.

   Examples of data-types include buddy lists, user-record, and services
   such as NAT and firewall traversal.


   +-----------------------------------------------------------+
   | +-------------------------------------------------------+ |
   | |                       Resource-ID                     | |
   | +-------------------------------------------------------+ |
   |  +-------------------------+  +-------------------------+ |
   |  |           Type1         |  |           Type2         | |
   |  | +---------+ +---------+ |  | +---------+ +---------+ | |
   |  | |Sub-type1| |Sub-type2| |  | |Sub-type1| |Sub-type2| | |
   |  | +---------+ +---------+ |  | +---------+ +---------+ | |
   |  |  +------+    +------+   |  |  +------+    +------+   | |
   |  |  |Value1|    |Value1|   |  |  |Value1|    |Value1|   | |
   |  |  +------+    +------+   |  |  +------+    +------+   | |
   |  |                         |  |                         | |
   |  |  +------+    +------+   |  |  +------+    +------+   | |
   |  |  |Value2|    |Value2|   |  |  |Value2|    |Value2|   | |
   |  |  +------+    +------+   |  |  +------+    +------+   | |
   |  |                         |  |                         | |
   |  +-------------------------+  +-------------------------+ |
   |                                                           |
   +-----------------------------------------------------------+

   Figure 3: Resource-object.

3.4.  Message Model

   P2PP messages begin with a header followed by a sequence of type-
   length-value (TLV) objects.  P2PP defines five types of message.
   However, the three key messages are requests, responses, and
   indications.  The requests always generate a response, where as
   indications do not require any.  Indications are useful in scenarios
   such as informing other peers about a routing table change.  The
   response have a response code which is inspired from HTTP and SIP
   response codes.

   P2PP allows nodes to forward requests in a recursive or an iterative
   manner.  In recursive routing, a request is forwarded from one peer
   to the other until it reaches its destination.  The response is then



Baset, et al.             Expires May 22, 2008                 [Page 15]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   sent along the same path on which the request was received.  In
   iterative routing, if a peer determines that it is not the
   destination of the message, it sends in its response the IP address
   of the next hop.  The request originator then sends the request to
   the next hop.  Peers never forward the indications.  Figure 4 and 5
   show a conceptual diagram of request routing in a recursive and
   iterative manner, respectively.


   Peer1          Peer2          Peer3
    |    Request    |              |
    |-------------->|    Request   |
    |               |------------->|
    |               |    Response  |
    |               |<-------------|
    |    Response   |              |
    |<--------------|              |

   Figure 4: A conceptual diagram showing request routing in a recursive
   manner.


   Peer1          Peer2          Peer3
    |    Request    |              |
    |-------------->|              |
    |    Response   |              |
    |<--------------|              |
    |            Request           |
    |-----------------------------<|
    |            Response          |
    |<-----------------------------|
    |                              |

   Figure 5: A conceptual diagram showing request routing in an
   iterative manner.

3.5.  Reliability Model

   P2PP defines a hop-by-hop reliability model, i.e., the request,
   response, and indications originators are only responsible for
   ensuring that the message reaches the next hop.  P2PP allows nodes to
   send messages over a reliable and unreliable transport.  For
   unreliable transports, P2PP provides an acknowledgement (ACK) based
   mechanism to ensure reliability of message delivery.  The
   acknowledgement is the fourth type of P2PP message.

   P2PP does not support message fragmentation and instead makes use of
   the underlying reliable transport such as TCP or TLS larger than MTU



Baset, et al.             Expires May 22, 2008                 [Page 16]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   messages.

   For recursive routing, the hop-by-hop reliability model allows the
   routing path to be a mix of reliable and unreliable transports.
   Figure 4 and 5 showed the message forwarding in a recursive manner
   and iterative manner over reliable transport.  Figure 6(a) and 7(a)
   show the unoptimized message forwarding in a recursive and iterative
   manner over unreliable transport.  In recursive routing, the peer
   responsible for generating a response sends an ACK and then
   immediately sends a response.  In iterative routing, every node must
   acknowledge the request and immediately send the response.  To avoid
   the transmission of an ACK followed by a response, P2PP, defines a
   fifth type of message, namely, responseACK which combines the
   response and acknowledgement in one message.


Peer1          Peer2          Peer3  Peer1          Peer2          Peer3
 |    Request    |              |      |    Request    |              |
 |-------------->|              |      |-------------->|              |
 |     ACK       |              |      |     ACK       |              |
 |<--------------|    Request   |      |<--------------|    Request   |
 |               |------------->|      |               |------------->|
 |               |      ACK     |      |               | ResponseACK  |
 |               |<-------------|      |               |<-------------|
 |               |   Response   |      |               |      ACK     |
 |               |<-------------|      |               |------------->|
 |               |      ACK     |      |   Response    |              |
 |               |------------->|      |<--------------|              |
 |   Response    |              |      |     ACK       |              |
 |<--------------|              |      |-------------->|              |
 |     ACK       |              |      |               |              |
 |-------------->|              |
             (a)                                      (b)

   Figure 6: Request routing in a recursive manner over unreliable
   transport. (a) unoptimized forwarding (b) optimized forwarding.















Baset, et al.             Expires May 22, 2008                 [Page 17]


Internet-Draft            Peer-to-Peer Protocol            November 2007


Peer1          Peer2          Peer3  Peer1          Peer2          Peer3
 |    Request    |              |      |    Request    |              |
 |-------------->|              |      |-------------->|              |
 |      ACK      |              |      |  ResponseACK  |              |
 |<--------------|              |      |<--------------|              |
 |    Response   |              |      |      ACK      |              |
 |<--------------|              |      |-------------->|              |
 |      ACK      |              |      |                              |
 |-------------->|              |      |            Request           |
 |                              |      |----------------------------->|
 |            Request           |      |           ResponseACK        |
 |----------------------------->|      |<-----------------------------|
 |              ACK             |      |              ACK             |
 |<-----------------------------|      |----------------------------->|
 |            Response          |      |                              |
 |<-----------------------------|
 |              ACK             |
 |----------------------------->|

               (a)                                     (b)

   Figure 7: Request routing in an iterative manner over unreliable
   transport. (a) unoptimized forwarding (b) optimized forwarding.

   Thus, P2PP defines five types of message, namely, request, response,
   responseACK, indication, and acknowledgement.  A response or
   responseACK must match to the request.  Similarly, an ACK must match
   to the request, response, or responseACK that it acknowledges.  The
   transmission of a request, response, responseACK, and an indication
   is governed by a transaction state-machine described in Section 6.2.

3.6.  Security Model

   P2PP provides a hop-by-hop security model.  The nodes in P2PP
   establish an unreliable or reliable secure channel with other nodes
   using DTLS or TLS.  However, peers establish a secure SIP session in
   an end-to-end manner.

   P2PP uses an enrollment and authentication (E&A) server to enroll new
   users in the overlay and to authenticate existing users.  Once
   authenticated, it issues a certificate that binds the user-identifier
   and public key of the user.  Further, it also generates a peer or a
   client identifier and adds it to the certificate.

   P2PP also allows nodes to operate without a central enrollment and
   authentication server.  In such a scenario, nodes use self-signed
   certificates and generate their own identifiers.




Baset, et al.             Expires May 22, 2008                 [Page 18]


Internet-Draft            Peer-to-Peer Protocol            November 2007


3.6.1.  Threat Model

   This section lists the security threats and discusses mechanisms P2PP
   provides to protect against some of these threats.  The threats
   against overlays can be loosely classified into routing, storage, and
   replay threats.  Below we list some of the possible attacks within
   each threat.  P2PP provides protection against some of these attacks.

   Routing Threats

   1.  Obtain a significant portion of user or peer identifiers to
       launch a Sybil attack.

   2.  Sniff on the messages between peers.

   3.  Corrupt a message flow between peers, thereby violating message
       integrity.

   4.  Infer user or flow identity from the legitimately received
       messages.

   5.  Incorrectly route or drop a message.

   6.  Poison routing or neighbor tables.

   7.  Launch a DoS or DDoS against a peer or set of peers.

   Storage Threats

   1.  Corrupt a stored object, thereby violating storage integrity.

   2.  Unauthorized storage or lookup.

   3.  Launch a storage DoS attack against a peer or set of peers.

   4.  Does not invalidate storage cache, thereby returning old copies
       of the stored object.

   Replay Threats

   1.  Replay a message.

   Currently, P2PP provides protection against (1)-(3) of routing
   threats, (1)-(3) of storage threats, and (1) of replay threats.  The
   next section discusses mechanism provided by P2PP for protection
   against these threats.





Baset, et al.             Expires May 22, 2008                 [Page 19]


Internet-Draft            Peer-to-Peer Protocol            November 2007


3.7.  NAT and Firewall Traversal

   P2PP allows any node to act as a NAT traversal server.  The node
   providing the NAT traversal service allows the node behind a NAT to
   discover their NAT types and to determine their reachable address
   using STUN [5] or TURN [6].  Many nodes can provide the NAT traversal
   service and a key issue is how this information is published in the
   overlay and how to discover an appropriate NAT traversal server.
   P2PP provides RTT and autonomous-system (AS) number based mechanisms
   for a node to discover a close-by NAT traversal server.  In a large
   corporation, peers may also use an IP-prefix based mechanism to
   discover a close by NAT traversal server.  P2PP leaves the selection
   of this mechanism to overlay operator.  P2PP also allows an
   overloaded node providing NAT traversal service to redirect NAT
   traversal requests to unloaded nodes.

   In a peer-to-peer network, there is no guarantee on the availability
   of a node.  A node whose reachability depends on a peer providing NAT
   traversal service may discover that the peer is no longer online.
   Consequently, the reachable IP address of a node obtained through a
   peer providing a NAT traversal service that is no longer online
   becomes invalid.  Therefore, a node may need to discover another peer
   providing NAT traversal service, determine its new reachable address,
   readvertise this information in the overlay, and establish new
   connections with routing and neighbor peers.  Depending on the churn
   rate, this can incur a significant communication overhead.

   The requests can be routed in a recursive or an iterative manner.
   The choice of routing mechanism has an impact on the performance of
   NAT traversal mechanism.  We discuss these issues in Section 4.3.2
   and suggest that the non significant overhead of ICE [7] as-is does
   not lead to its automatic selection as a NAT traversal mechanism.

   TODO: Besides NATs, the firewalls can hinder connectivity and result
   in non-transitivity of connection.

3.8.  Mobility

   We classify P2PSIP mobility into three subcategories: peer mobility,
   client mobility, and session mobility.  The following sections
   discuss different aspects of P2PSIP mobility in details.

3.8.1.  Peer Mobility

   Mobile devices such as mobile and WiFi phones or laptops may move
   from one network to another by doing handover between different
   access networks or moving from one WLAN access point to another.
   Whenever a peer changes its access network (e.g., from WCDMA to



Baset, et al.             Expires May 22, 2008                 [Page 20]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   WLAN), its IP address also changes.  In P2PSIP networks where P2PSIP
   peer software runs also in mobile terminals, peer-IDs must not be
   assigned based on IP addresses.  If a peer-ID was constructed using
   an IP address of a peer, any change in the IP address would cause the
   change of the peer-ID, introducing instability in the DHT network.
   Further, a peer needs to inform its routing and neighbor peers about
   any change in the IP address.

   Any change in the peer-ID computed using IP address require a peer to
   leave the P2PSIP overlay network and join the overlay network once
   again with the new peer-ID.  Besides updates to the DHT do not take
   place immediately after a node has gone.  It may take some time until
   all the data is again in the proper place, including the re-creation
   of routing tables.  This may cause network instability and require
   additional resources to handle network adaptation especially in a
   battery powered mobile devices.  Besides in the transition period
   search delay for user contact information may be higher, delaying the
   call establishment.

   Rather than constructing peer-IDs by hashing the IP address or a
   random peer-ID, which is no longer static for the duration of the
   connection to the DHT, P2PP allows P2PSIP networks to assign a static
   and unique (within a DHT ring) peer-IDs.  The enrollment and peer-ID
   assignment is presented in Section 4.5.  In addition, P2PP allows
   peers to advertise changes of their IP addresses to other peers.
   When a peer moves to another subnet after a handover, it receives a
   new IP address.  Since the peer-ID does not change, it does not
   introduce instability into the DHT.  However, the peer has to inform
   its neighbors about its new IP address.  To each neighbor, the peer
   presents the new IP address, and authentication data (a certificate)
   that also includes the existing peer-ID.  The neighbor authenticates
   the update request and stores the new IP address bound to that
   peer-ID.

3.8.2.  Client Mobility

   Mobile clients may change IP address in the same way as mobile peers
   do.  The main difference between the client mobility and the peer
   mobility is that the client mobility does not influence the structure
   of the overlay.  However, the client mobility may have impact on the
   reachability of the client itself.  In case of a handover, a mobile
   client must update user records in DHT in real time if it still wants
   to be reachable.  In order to fulfill this requirement, the client
   must contact the peer that stores the user record.  When the client
   changes its IP address, it must update the user record by sending
   publish request directly to the peer storing the record.  If the peer
   is not reachable, the client must send the publish request to any of
   the available peers using either recursive or iterative routing.



Baset, et al.             Expires May 22, 2008                 [Page 21]


Internet-Draft            Peer-to-Peer Protocol            November 2007


3.8.3.  Session Mobility

   Session mobility is related to the mobility of SIP user agent during
   a SIP session.  This may happen when one or more endpoints that are
   participating in the same SIP session change their IP addresses
   because of a handover.  In order to preserve the service continuity,
   clients need to support a method that will minimize session
   interruption due to handovers.  This memo does not provide any
   solution for SIP session mobility.  Instead, it is expected that a
   generic SIP solution for session mobility will be re-utilized in
   P2PSIP once such solution is developed.

3.9.  Overview of Operations

   The following table gives a brief description of P2PP messages and
   their message type.  It also indicates which messages may be sent by
   a peer or a client.  The messages have been grouped together by
   relevant functions.

3.9.1.  Enrollment, Authentication, and Bootstrap

   +--------------+---------+--------+---------------------------------+
   | Operation    | Message | Peer   | Description                     |
   |              | Type    | or     |                                 |
   |              |         | Client |                                 |
   +--------------+---------+--------+---------------------------------+
   | Enroll       | R       | P|C    | Enrolls the user in the         |
   |              |         |        | overlay.                        |
   |              |         |        |                                 |
   | Authenticate | R       | P|C    | Authenticate the user and       |
   |              |         |        | generates a certificate binding |
   |              |         |        | user-ID, peer or client ID, and |
   |              |         |        | public key of the peer.         |
   |              |         |        |                                 |
   | Bootstrap    | R       | P|C    | Clients and peers send this     |
   |              |         |        | request to a bootstrap server   |
   |              |         |        | or a peer to discover the IP    |
   |              |         |        | address of a peer in the        |
   |              |         |        | overlay.                        |
   +--------------+---------+--------+---------------------------------+











Baset, et al.             Expires May 22, 2008                 [Page 22]


Internet-Draft            Peer-to-Peer Protocol            November 2007


3.9.2.  Overlay Maintenance

   +---------------+---------+--------+--------------------------------+
   | Operation     | Message | Peer   | Description                    |
   |               | Type    | or     |                                |
   |               |         | Client |                                |
   +---------------+---------+--------+--------------------------------+
   | Join          | R       | P|C    | Peers send this request to     |
   |               |         |        | join the overlay.  Depending   |
   |               |         |        | on the peer protocol being     |
   |               |         |        | used, the join request is      |
   |               |         |        | forwarded to the peer where    |
   |               |         |        | this peer will join.  Client   |
   |               |         |        | sends a join request to a peer |
   |               |         |        | discovered using bootstrap     |
   |               |         |        | mechanism and becomes attached |
   |               |         |        | to the peer.                   |
   |               |         |        |                                |
   | Leave         | I       | P|C    | Peers send the leave           |
   |               |         |        | indication to their routing    |
   |               |         |        | and peers indicating their     |
   |               |         |        | departure.  Clients            |
   |               |         |        | periodically send the leave    |
   |               |         |        | message to their respective    |
   |               |         |        | peers.                         |
   |               |         |        |                                |
   | KeepAlive     | I       | P|C    | Peers periodically send a      |
   |               |         |        | keepalive indication to their  |
   |               |         |        | routing and neighbor peers to  |
   |               |         |        | check whether they are alive.  |
   |               |         |        | Clients send a keepalive to    |
   |               |         |        | their peers to check whether   |
   |               |         |        | they are alive.                |
   |               |         |        |                                |
   | LookupPeer    | R       | P      | Peers send this request to     |
   |               |         |        | discover a peer that may fill  |
   |               |         |        | or update a missing entry in   |
   |               |         |        | their routing or neighbor      |
   |               |         |        | table.                         |
   |               |         |        |                                |
   | ExchangeTable | R       | P      | Peers periodically send this   |
   |               |         |        | request to their routing and   |
   |               |         |        | neighbor peers obtain their    |
   |               |         |        | routing and neighbor tables.   |
   |               |         |        |                                |






Baset, et al.             Expires May 22, 2008                 [Page 23]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   | Replicate     | R       | P      | Peers periodically send this   |
   |               |         |        | request to replicate the       |
   |               |         |        | resource-objects for           |
   |               |         |        | availability.  The choice of   |
   |               |         |        | peers on which to replicate    |
   |               |         |        | the objects depends on the     |
   |               |         |        | peer protocol.                 |
   |               |         |        |                                |
   | Transfer      | R       | P      | After a successful join or     |
   |               |         |        | graceful or ungraceful failure |
   |               |         |        | of peers, a peer transfers the |
   |               |         |        | ownership of resource-objects  |
   |               |         |        | using a transfer request.      |
   +---------------+---------+--------+--------------------------------+

3.9.3.  Data Storage and Retrieval

   +---------------+---------+--------+--------------------------------+
   | Operation     | Message | Peer   | Description                    |
   |               | Type    | or     |                                |
   |               |         | Client |                                |
   +---------------+---------+--------+--------------------------------+
   | PublishObject | R       | P|C    | Publish a resource-object.     |
   |               |         |        | Also, used to refresh or       |
   |               |         |        | update an existing             |
   |               |         |        | resource-object.               |
   |               |         |        |                                |
   | LookupObject  | R       | P|C    | Search for a resource-object.  |
   |               |         |        |                                |
   | RemoveObject  | R       | P|C    | Remove the resource-object.    |
   +---------------+---------+--------+--------------------------------+

3.9.4.  Connection Management and Other

   +-----------+---------+--------+------------------------------------+
   | Operation | Message | Peer   | Description                        |
   |           | Type    | or     |                                    |
   |           |         | Client |                                    |
   +-----------+---------+--------+------------------------------------+
   | Tunnel    | R       | P|C    | Tunnel an application layer        |
   |           |         |        | protocol message into a P2PP       |
   |           |         |        | message.  Mostly used for sending  |
   |           |         |        | SIP messages to peers or clients   |
   |           |         |        | behind a NAT.                      |
   |           |         |        |                                    |
   | Connect   | R       | P|C    | Send an ICE offer (TBD).           |
   |           |         |        |                                    |




Baset, et al.             Expires May 22, 2008                 [Page 24]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   | Invite    | R       | P      | Peers send an invite request to a  |
   |           |         |        | client, inviting them to become a  |
   |           |         |        | peer.                              |
   |           |         |        |                                    |
   | Query     | R       | P|C    | Query a peer or a client to        |
   |           |         |        | discover the services they provide |
   |           |         |        | or the resource-objects they       |
   |           |         |        | store.                             |
   +-----------+---------+--------+------------------------------------+

3.10.  Overlay Migration

   This mechanism allows nodes to migrate from one overlay protocol to
   the other and to download a software update for the overlay protocol.
   (TBD.)




































Baset, et al.             Expires May 22, 2008                 [Page 25]


Internet-Draft            Peer-to-Peer Protocol            November 2007


4.  Overlay Layer

4.1.  Peer State

   A 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.

   Base:  The logarithm base for a DHT, if a DHT is used as a peer
      protocol.

   Routing Table:  A table of other peers in the overlay.  For each
      peer, the 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 and port: The IP address and port 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, the 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 and port: The IP address and port of the peer.

      RTT: The round-trip-time of this peer.

      Uptime: The uptime of the peer (overlay software).

   Number of Neighbors:  Total number of peers in routing and neighbor
      tables.





Baset, et al.             Expires May 22, 2008                 [Page 26]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Publish Table:  The resource-objects this peer has published in the
      overlay.  It must periodically refresh the resource-objects before
      the passage of their refresh time interval.

   Resource Table:  Resource-objects this peer is responsible for.

   Replicated Resource Table:  Resource-objects this peer stores as
      backup for other objects.

   Transaction Table:  A transaction table which keeps track of in-
      progress transactions.  The transaction can be a request,
      response, or an indication transaction.

   Uptime:  The uptime of this peer.

   Number of Clients:  Number of clients connected to this peer.

   Media Relay Flows:  The number and bandwidth of media flows being
      relayed through this peer.

   Additionally, it may keep track of the following diagnostic
   information:

   Bandwidth:  The current bandwidth being used.

   Number of Messages:  The number and cumulative size of messages
      received within the last x seconds.

   Autonomous System Number:  The AS number of the peer.  It can be used
      to advertise STUN or TURN services.

4.2.  Key Components of a P2PP Message

   This section describes the key TLV objects defined by P2PP.

   Common Header: The common header is a fixed length header which is
   part of every message (Section 9.1.  It contains the message type,
   request or indication type, TTL, a magic cookie to differentiate P2PP
   from other protocols, transaction-ID, source-ID and a response-ID.
   The message type defines the type of the message, namely, request,
   response, responseACK, or indication where as the request or
   indication type defines the type of request or indication being sent.
   The transaction-ID is a unique number chosen by the request or
   indication originator.  The source-ID represents the peer-ID of the
   message originator peer.  Response-ID is only included in the ACK,
   response, or a responseACK, and represents the peer-ID of the peer
   generating the response, responseACK, or ACK.  Since peer-IDs must be
   unique and peers must choose a locally unique transaction-ID, the



Baset, et al.             Expires May 22, 2008                 [Page 27]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   combination of source-ID and transaction-ID can uniquely identify a
   message.

   Peer-Info: Peer-Info TLV represents a peer in the overlay.  A peer
   has a fixed length identifier and a set of reachable IP address and
   port numbers gathered using ICE.  Further, a peer maintains its
   uptime information, number of connected clients, routing and neighbor
   peers, a certificate, and bandwidth.  This information is encoded as
   follows:

   Peer-Info = Peer-ID
               [Address-Info]
               [Uptime]
               [Certificate]
               [Connections]
               [Node-Resource-Utilization]
               [ext]

   Similar to peers, clients also have an identifier derived from the
   same identifier space as peers.  There is almost no difference
   between the peer-info TLV representing a peer and peer-info TLV
   representing a client, except that other peers must not update their
   routing and neighbor tables with the client.  Peers can also invite
   clients to become peers in the overlay and therefore, it made sense
   that clients already have an identifier when they receive such an
   invitation as they can then immediately join the overlay, without
   going through an E&A server and obtaining a certified peer-ID.

   This specification represents both peers and clients with a peer-info
   object.  When forwarding messages, the message originated by a peer
   or a client is differentiated based on a 'peer or client' flag in the
   common header.

   An approximate size of a peer-info object for a 20 byte peer-ID, and
   an address info object containing host, server-reflexive, and relay
   candidates is (4+4+20+4+46)=78 bytes.

   Resource-Object: Resource-object represents the information that
   peers store in the overlay.  As discussed in Section 3.2, a resource-
   object has a resource-ID, type, sub-type, and a value.  Further, a
   resource-object has additional properties, namely, owner, peer who
   inserted or updated the object, and a signature.  Resource-ID is a
   fixed length identifier for DHTs and could be a variable length
   identifier for unstructured overlays.  The size of the resource-
   object is limited to 65,536 bytes.  A resource-object is encoded as
   follows:





Baset, et al.             Expires May 22, 2008                 [Page 28]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Resource-Object = Resource-ID
               [Peer-Info]
               [Owner]
               [Signature]
               Value
               [ext]

4.3.  Request, Response, and Indications Processing

   To send a request, response, responseACK, or an indication, a peer
   creates a transaction and passes it the message.  The peer identifies
   a transaction using a source-ID and transaction-ID tuple as described
   in Section 6.1.  For response and responseACK, an additional
   consideration is that it must contain the same source-ID and
   transaction-ID as the request for which the response is being
   generated.  Similar considerations hold for ACK which acknowledges
   requests, responses, or indications over unreliable transport.
   Following considerations apply when sending a message.

   1.  A node may set request-routing-table or request-neighbor-table
       flags requesting to receive the peer-info objects containing
       peer-ID and address-info objects.  If the message was sent over
       unreliable transport, the node issuing the request SHOULD always
       set the in-separate-request flag in the Request-Options object.
       For a routing table that contains 100 nodes, which can be typical
       for a million user overlay, and an average peer-info object size
       of 78 bytes, the routing or neighbor table is not likely to fit
       within response UDP packet.

   A message can be received over UDP or TCP.  A message received over
   unreliable is processed according to the following steps:

   1.  The peer checks whether a transaction already exists in the
       transaction table.  As described in Section 4.1, a peer keeps
       track of in-progress transactions in a transaction table.  If a
       transaction exists, the peer sends an ACK response and terminates
       the message processing.  The received requests are matched
       against the response transaction having the same source-ID and
       transaction-ID where as the received responses are matched
       against request and response transactions.

   2.  If the transaction does not exist in the transaction table, the
       peer checks the TTL field in the common header.  If TTL is equal
       to zero, and the message was a request, it MUST reply with a 410
       (TTL Hops Exceeded) response and include its Peer-ID in the
       Response-ID field in the common header.  Additionally, it MUST
       send an ACK to the received request.  If a peer receives a
       response, indication or an ACK with a TTL equal to zero, it



Baset, et al.             Expires May 22, 2008                 [Page 29]


Internet-Draft            Peer-to-Peer Protocol            November 2007


       ignores the message.  Instead of sending a separate ACK and a
       response message, it sends a responseACK message.  It creates a
       responseACK transaction as shown in Figure 3 and passes it the
       responseACK message.  The transaction has the same source-ID as
       the one received in the request.  The response-ID is set to the
       ID of the peer generating response or responseACK.  The response
       is always sent to the peer from whom the request was received and
       not to the peer who issued the request.

   3.  If TTL is greater than zero, recursive routing was being used (R
       flag is set in the common header), and the peer cannot generate a
       response for the received request, it determines the next hop
       from its routing or neighbor tables, creates a request
       transaction, and passes it the request after decrementing TTL by
       one in the common header.  The transaction has the same
       identifier (source-ID, transaction-ID) as the one received in the
       request.  The rest of the forwarded request remains unchanged.
       Also, it sends an ACK message to the peer from whom it received
       the request and sets its own peer-ID in the response-ID of the
       ACK message.  If a response is received for which a corresponding
       request transaction exists, the peer immediately terminates the
       request transaction, creates a response transaction and passes it
       the received response for delivery to the upstream peer.

   4.  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 creates a
       responseACK transaction and passes it a 302 (Next Hop) response.
       The peer includes its Peer-Info and the next hop Peer-Info object
       in the responseACK message.

   5.  If a peer can generate a response for a received request, it must
       create a responseACK transaction.  If a peer receiving the
       request determines that it can generate a response, 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 RA and RB seconds, and sends a copy of
       its routing or neighbor table or both in an ExchangeTable request
       to the peer which issued the request (not the peer which
       forwarded the request).  If in-separate-request was not set, the
       peer includes in the response as much of the requested routing or
       neighbor table entries as permitted by the UDP MTU.

   6.  If the peer receiving the request determines that it can generate
       a response 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



Baset, et al.             Expires May 22, 2008                 [Page 30]


Internet-Draft            Peer-to-Peer Protocol            November 2007


       retry the request over TCP.  A 413 response is not sent if the
       response can fit within UDP MTU but requested routing or neighbor
       table cannot fit within MTU.

   7.  A peer should always send an ACK to any retransmissions of the
       request, response, or indication.

   8.  The peer checks if it can update its routing and neighbor tables
       from the received request or response.

   9.  If a peer receives a response, it immediately replies with an ACK
       message.  It then searches for the corresponding request
       transaction in its transaction table.  If a request transaction
       is found, and if the peer receiving the response was the request
       originator it passes the response to the overlay layer.
       Otherwise, it creates a response transaction and passes it the
       received response.  The response is sent to the same IP address
       and port number from which the request was received.  If a
       request transaction is not found and the peer receiving the
       response was not the request originator, the response is
       discarded.  However, an ACK is still generated for the discarded
       response.  The transmission of ACK is an indication that the peer
       receiving the response is still alive.

   A peer sending an indication sets the TTL field to one.  A peer
   receiving an indication over unreliable transport immediately
   generates an ACK.  An indication is never forwarded so R flag is
   never set for an indication.

   To send a message over a reliable transport, a peer creates an
   appropriate transaction as shown in Figure 4 and 5 and passes it the
   message.

   A request or response received over a reliable transport is processed
   according to the following steps.

   1.  The peer checks whether a transaction already exists in the
       transaction table.  This transaction can either be a request,
       response transaction.

   2.  If the transaction does not exist in the transaction table, the
       peer checks the TTL field in the common header.  If TTL is equal
       to zero, it MUST reply with a 410 (TTL Hops Exceeded) response
       and include its Peer-ID in the Response-ID field in the common
       header.  It creates a response transaction as shown in Figure 5
       and passes it the response .  The transaction has the same
       identifier as the one received in the request.  The response is
       always sent to the peer from whom the request was received and



Baset, et al.             Expires May 22, 2008                 [Page 31]


Internet-Draft            Peer-to-Peer Protocol            November 2007


       not to the peer who issued the request.

   3.  If TTL is greater than zero, recursive routing was being used (R
       flag is set in the common header), and the peer cannot generate a
       response for the received request, it determines the next hop
       from its routing or neighbor tables, creates a request
       transaction, and passes it the request after decrementing TTL by
       one in the common header.  The transaction has the same
       identifier (source-ID, transaction-ID) as the one received in the
       request.  The rest of the forwarded request remains unchanged.

   4.  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 creates a
       response transaction and passes it a 302 (Next Hop) response.
       The peer includes its Peer-Info and the next hop Peer-Info object
       in the response.

   5.  If a peer receiving the request determines that it can generate a
       response, it checks if the Request-Options object was present and
       whether request-routing-table or request-neighbor-table and in-
       separate-request flags were set.  If set, the peer waits for a
       random time between RA and RB 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 in the response up to 256 routing and
       neighbor table entries each.

   6.  The peer checks if it can update its routing and neighbor tables
       from the received request or response.

   7.  The peer receiving the response searches for the corresponding
       request transaction in its transaction table.  If a request
       transaction is found, and if the peer receiving the response was
       the request originator it passes the response to the overlay
       layer.  Otherwise, it terminates the request transaction, creates
       a response transaction and passes it the received response.  The
       response is sent to the same IP address and port number from
       which the request was received.  If a request transaction is not
       found and the peer receiving the response was not the request
       originator, the response is discarded.

4.3.1.  ACK generation

   A node MUST send an ACK for every request, response, responseACK, or
   indication received over unreliable transport.  The following diagram
   depicts the message for requests forwarded in a recursive manner over
   unreliable transport.



Baset, et al.             Expires May 22, 2008                 [Page 32]


Internet-Draft            Peer-to-Peer Protocol            November 2007


     A                        B                         C
   (idA)                    (idB)                     (idB)
     |  req(sid=idA,rid=)     |                         |
     |----------------------->|                         |
     |  ACK(sid=idA,rid=idB)  |                         |
     |<-----------------------|    req(sid=idA,rid=)    |
     |                        |------------------------>|
     |                        | respACK(sid=idA,rid=idC)|
     |                        |<------------------------|
     |                        |   ACK(sid=idA,rid=idC)  |
     |                        |------------------------>|
     |respACK(sid=idA,rid=idC)|                         |
     |<-----------------------|                         |
     |  ACK(sid=idA,rid=idC)  |                         |
     |----------------------->|                         |

   Figure 6: Message flow for requests forwarded in a recursive manner
   over unreliable transport.

   The encoding of response-ID field in the ACK is according to the
   following rule: If no response-ID was received in the message, then
   the node generating an ACK MUST include its own peer-ID as the
   response-ID.  If the source-ID and response-ID field were already
   present in the message, then the ACK message should copy back
   source-ID and response-ID fields.

4.3.2.  Recursive and Iterative Routing

   P2PP does not require all peers must use either recursive or
   iterative routing.  Based on their connectivity information, peers
   may choose to send requests in a recursive or iterative manner.  The
   request routing mechanism is determined by a recursive or iterative
   flag in the common header.  Only requests can be sent in a recursive
   or iterative manner.  Below, we discuss the issues involved in the
   use of recursive and iterative routing that highlight the need to
   support both mechanisms.  Further, we also discuss the issues that
   are peculiar to the recursive or iterative forwarding of requests.

4.3.2.1.  Loop Detection

   Iterative routing does not require the design of complicated
   mechanisms, such as route-log, for detecting forwarding loops nor is
   there a need to design mechanisms for message forking and fork
   explosion.







Baset, et al.             Expires May 22, 2008                 [Page 33]


Internet-Draft            Peer-to-Peer Protocol            November 2007


4.3.2.2.  Rogue Peer

   If the message is forwarded in a recursive manner, a rogue peer along
   the request path may simply drop the message.  It will be a while
   before the request originator realizes such a behavior.  In iterative
   routing, a peer has control of the messages and it could quickly
   determine if its messages are being dropped.

4.3.2.3.  Secure Channel Establishment

   In recursive routing, a peer sends a message to its routing or
   neighbor peers.  It is likely that a node sending the message has a
   secure reliable or unreliable channel with its routing or neighbor
   peers.  In iterative routing, a node may need to communicate with
   previously uncontacted peers.  It is quite possible that the peers
   contacted during iterative routing may never be contacted again.
   When requests are routed in an iterative manner, and if a peer
   somehow has certificate of the communicating peer, it may use DTLS or
   TLS.

   In DTLS the secure channel establishment at least requires two RTT of
   setup time.  In addition, for TLS, a TCP connection must be
   established.  This requires 1.5 RTT of setup time.  The nodes can
   securely communicate after the establishment of secure and/or
   reliable channel.

   If a node uses DTLS or TLS to establish a secure channel with other
   nodes while forwarding requests in an iterative manner, it could
   incur a per hop setup overhead of 2 and 3.5 RTT for DTLS and TLS,
   respectively.  Recursive routing does not have this setup overhead
   because nodes typically only communicate with peers in their routing
   and neighbor tables with which they have a long lived secure
   connection.  This makes the choice of iterative routing less
   attractive than recursive routing.

   As discussed in Section 4.3.2 iterative routing has three nice
   properties.  First, unlike recursive routing, the request originator
   has control over which nodes it should contact.  Second, the number
   of message hops is always one which prevents complicated routing bugs
   and schemes for loop detection.  Finally, it prevents fork explosion
   when parallel copies of the request are issued in a recursive manner.

   Thus, we believe, there is a need to incorporate iterative routing
   mechanism as part of P2PP and ensure that the use of underlying
   transport protocol such as DTLS does not impact the performance of
   iterative routing vis-a-vis recursive routing.  Clearly, DTLS is
   unsuitable for iterative routing due to it's per hop secure channel
   setup overhead.  Therefore, we propose a to design a new secure and



Baset, et al.             Expires May 22, 2008                 [Page 34]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   unreliable transport protocol which preserves message confidentiality
   and integrity, and is geared towards iterative routing in overlay
   networks.  This suggestion is open to discussion.

4.3.2.4.  NAT Traversal

   Recursive routing is more friendly towards NATs and firewalls since a
   peer sends a message to the peers that have been recently
   communicated with.  In iterative routing, a peer will likely have to
   send a message to a previously unknown peer.  This unknown peer could
   be behind a NAT.  A mechanism based on an offer/exchange mechanism of
   ICE will incur a significant communication overhead (REF:sec).
   Further, it is possible that a peer may not need to subsequently
   communicate with this peer behind the NAT and the overhead of ICE
   connectivity checks is perhaps overkill.  The other mechanism to
   communicate with a peer behind a NAT is that a peer simultaneously
   sends the message to the host, server reflexive, and relay address of
   the peer behind a NAT.  This requires the peer behind a NAT to
   publish and periodically refresh this information.

4.3.2.5.  Route Log

   The recursive forwarding of requests require intermediate peers to
   maintain state.  The peers forwarding the request in a recursive
   manner may avoid the need of maintaining state by adding their Peer-
   Info objects to the route-log.  The peers can only add their Peer-
   Info objects to the route-log if it was explicitly requested by the
   request originator.

   As discussed in Section 4.2, the approximate size of a peer-info
   object containing peer-ID and host, server-reflexive, and relay
   addresses is 78 bytes.  If the request traverses approximately 20
   hops, the route-log size can easily exceed UDP MTU (assuming UDP is
   1,500 bytes).  Route-logs are not needed when messages are forwarded
   in an iterative manner.

4.4.  Message Encoding Guidelines

   The message originator sets the source-ID in the message header and
   includes its peer-info object in the message.  It may set the peer-ID
   object in the peer-info object.  The peer generating an ACK or a
   response retains the request originator peer-ID in source-ID field.
   Additionally, it sets its own peer-ID in the response-ID field in the
   common header and includes its peer-info object.  Unless requested by
   the message originator, the ACK or response message does not include
   the request originator's peer-info object.  The rationale is that the
   request originator's peer-info has already been seen by the peers
   along the request path and its inclusion in the response or an ACK



Baset, et al.             Expires May 22, 2008                 [Page 35]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   gives no further information.

   If the message originator requested a route log, then peers along the
   message path MUST add their peer-info objects after the peer-info
   objects in the received message.

4.5.  Enrollment and Authentication

   This section describes secure enrollment and authentication in a
   P2PSIP network using PKCS#10 on top of TLS and an optional HTTP
   digest mechanism.  The secure enrollment assumes the existence of a
   Registration Authority (RA) and Certificate Authority (CA).  The
   functions of RA and CA can be implemented in separate network
   entities, however for simplicity assume we that they are collocated
   in one entity called an enrollment and authentication (E&A) server.

   To enroll in an overlay, a user chooses an identifier and a password.
   The user identifier can be an email address, a SIP AoR, or any
   appropriate blob.  The node then generates a public/private key pair
   and embeds the user and node identifier in the distinguished name of
   a certificate signing request (CSR).  The node must store the private
   key as securely as possible.  The CSR is encoded using PKCS#10
   [REF:].  The node then establishes a TLS connection with the server
   (without client certificate authentication) and sends the CSR with
   H(password) to the enrollment and authentication server (E&A) in an
   enroll request.

   If the request is authenticated, the server creates a random or a
   static peer-ID and embeds it in a DER encoded X.509 certificate along
   with the user identifier.  It then sends this X.509 certificate
   containing user-ID, peer-Id and the expiration time in a 200 (Ok)
   response to the peer that sent the enroll request.  If a bootstrap
   server is co-located with the E&A server, the 200 response includes a
   P2P-Options TLV and a list of bootstrap peers.

   One reason for the server to choose a peer-ID for the peer instead of
   the peer randomly generating its peer-ID is that a joining peer is
   unaware of the hash algorithm being used.  The other reason is that
   it prevents a node from selecting a peer-ID or set of peer-IDs that
   it may use occupy a certain position in a structured overlay.  In a
   mobility based deployment of P2PP, the server may assign the same
   peer-ID to the peer during its subsequent runs to minimize the effect
   of churn.

   A node which is already enrolled does not generate a new public /
   private key pair.  Instead, it uses its existing public key and
   user-ID to generate a CSR and sends it along with a H(password) to
   the E&A server in an authenticate request.  (TODO: certificate reuse



Baset, et al.             Expires May 22, 2008                 [Page 36]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   before expiry)

   The enrollment and authentication mechanism is separate from the
   bootstrap mechanism because overlay may be formed in a non-secure
   environment.  The E&A and bootstrap servers may be co-located.  This
   is useful in a small network scenario.

   A first peer in the overlay or any peer can also act as an E&A
   server.

   The separation of user-ID and peer-ID allows multiple devices
   representing the same user to participate in the overlay.  An
   structured overlay implementer may use peer-ID=H(user-ID), which
   would mean that a node publishing the user-info object is the one
   responsible for it.

4.5.1.  HTTP Digest Authentication

   TODO: draw figure.

   The message flow describes enrollment process in P2PSIP including the
   certificate request originated by a P2PSIP node using PKCS#10 with
   HTTP Digest on top of TLS.  The flow starts with a P2PSIP node
   generating a public-private key pair.  Next the P2PSIP node
   establishes a TLS connection with an enrollment server.  It may
   registers its user-ID and password.  The user-ID is in the form of
   SIP URI: username@domain.  The registration of a user-ID and password
   can be separated from the enrollment process; however in this example
   we assume that both processes happen at the same time.

   Next the P2PSIP node sends a POST HTTP request to the enrollment
   server which generates an 403 Unauthorized response.  The response
   contains a WWW-Authenticate header which instructs the node to use
   HTTP Digest authentication.  The node creates a PKCS#10 request with
   the user-ID, public key, and optionally additional attributes and
   extensions.  It sends the PKCS#10 request in the HTTP request by
   calculating the Authorization header values using the username and
   password.

   When the enrollment server receives the request, it verifies the
   Authorization header using user name and password as specified in RFC
   2617 [X].  If the verification succeeds, the incoming PKCS#10 request
   is taken in for further processing.  After the PKCS#10 request has
   been processed and certificate(s) has been created, the enrolment
   server generates a HTTP response containing the certificate.  The
   enrolment server generates a single certificate that includes both
   the user-ID and a peer-ID.  When P2PSIP peer/client receives the
   certificate(s), it stores the certificate (or set of certificates) to



Baset, et al.             Expires May 22, 2008                 [Page 37]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   the local certificate management system.

   OPEN ISSUE: Is it more reasonable to include the user-ID and the
   peer-ID in a single certificate or to have separate certificates?

4.5.2.  Authentication without a Central Authority

   TBD.  Shared secret is one of the mechanisms.

4.6.  Bootstrap

   To join an overlay, a joining peer (JP) must determine the peer
   protocol that is being run in the overlay and must discover a peer
   that is already part of the overlay, thereafter called an admitting
   peer (AP).  The bootstrap process assumes that JP has already been
   enrolled and authenticated.

   There are different mechanisms to discover a node already in the
   overlay as specified by Matthews [21].  This specification defines
   one mechanism, namely, bootstrap node or server that a joining peer
   can use to discover a peer already in the overlay.  This mechanism
   assumes that the joining node already knows the IP address and port
   number of a bootstrap node or server.  The bootstrap node may or may
   not be part of the overlay and it may be co-located with the
   enrollment and authentication server.

   To discover the peers already in the overlay, a JP sends a bootstrap
   request to the bootstrap node or server.  The bootstrap node or
   server replies with its own peer-info object, the peer-info object of
   the peer that sent the bootstrap request along with its randomly
   generated peer-ID, a list of peer-info objects representing peers in
   the overlay, and a P2P-Options TLV.  The JP then sends the join
   request to one of the peers in the list.  If the list is empty, then
   the joining peer is the first peer in the overlay.

   A node sending the bootstrap request sets a 32-bit source-ID of
   0x00000000.  The bootstrap node sets a 32-bit response-ID of
   0x00000001 in its response, even if it is part of the overlay,
   because the peer sending the bootstrap request may not be aware of
   the overlay parameters.

   If a JP has obtained a list of bootstrap peers in response to
   authenticate request, it does not need to send a bootstrap request.

4.7.  Joining, Leaving






Baset, et al.             Expires May 22, 2008                 [Page 38]


Internet-Draft            Peer-to-Peer Protocol            November 2007


4.7.1.  Join

   A JP discovers the overlay protocol and existing peer in the overlay
   using the bootstrap mechanism described in Section 4.6.  It then
   sends a join request to the peer in the overlay.  The overlay nodes
   are connected in a graph and conceptually, a JP adds a new vertex to
   this graph.  Thus, the join process should correctly inform the JP's
   immediate neighbor peer(s) and take ownership of any resource-objects
   from them.  Overall, the join operation involves the following steps:

   1.  Determine its reachable address.

   2.  Discover the peer(s) where the node will join.

   3.  Inform the discovered peer(s) about itself.

   4.  Build routing and neighbor tables (if any).

   5.  Get ownership of any resource-objects.

   6.  Publish user-info, the reachable address for the user.

   A JP searches for an appropriate STUN and TURN server in the overlay.
   The criteria for searching a STUN and/or a TURN server depends on the
   overlay implementer.  After searching for the appropriate server, a
   JP determines its host, server-reflexive, and relay addresses.

   The JP MAY request the join request to be forwarded in a recursive
   (R=1) or an iterative manner (R=0).  It does so by setting the
   appropriate value of R flag in the common header.  A peer receiving
   the join request with the recursive routing flag set forwards it to
   the peer where JP will join.  A peer receiving the join request with
   iterative routing flag set replies with a 302 (Next Hop) response if
   the JP will not be its immediate neighbor.

   If a peer receiving the request determines that the JP 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 JP should send a keepalive message.  The response may also
   contain a copy of the neighbor table of the peer.

   Once the JP 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 the peers in the received neighbor
   table.  The join request with S flag set indicates the overlay peers
   that the JP will be their new neighbor.  It is up to the peer
   generating the 200 (Ok) response to decide, based on the p2p
   algorithm being used, which neighbors (successors, predecessors) a



Baset, et al.             Expires May 22, 2008                 [Page 39]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   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.  If the structured
   peer protocol does not require a neighbor table, then the join
   request with S flag is not sent.

   A JP MAY request to receive a copy of routing and neighbor tables of
   the peers that receive the join request.  It does so by following the
   rules defined in Section 4.3.

   Finally, a JP publishes the user-info object in the overlay as
   described in Section 4.8.1.  The user-info object contains the X.509
   certificate, and the host, server-reflexive, and relay addresses of
   the peer.  The successful response contains an Expires header.  A
   node keeps track of the resource-objects and their expire times in a
   'Publish Table' (Section 4.1).  A JP should resend a publish request
   with the user-info object before the passage of time in Expires
   header.

   Once, the JP has successfully joined the overlay, its neighbor peers
   transfer it the ownership of appropriate resource-objects, using a
   Transfer request.  The JP may also establish secure connections with
   its routing or neighbor peers.

4.7.1.1.  Rejecting or Deferring a Join Request

   Peers in the overlay may decide to reject a join request with a 406
   (Request Rejected) response because it does not satisfy the overlay
   policy for peers.  NAT and node resources are examples of such
   policies.  This specification does not specify any policy for peer
   admission and defers this decision to the overlay operator.

   Peer(s) in the overlay may not be willing to admit a JP 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
   reissue the join request.  The JP receiving this response should join
   as a client in the overlay.  It should reissue the join request
   without setting the peer flag in the common header.

   After the passage of time in Expires header, a client may attempt to
   insert itself again as a peer in the overlay.  The AP or other peers
   may explicitly invite the client to join the overlay before the
   passage of time in the Expires field by sending an Invite request.

4.7.1.2.  Client Join

   A client enrolls and authenticates itself and discovers a peer
   already in the overlay using mechanisms defined in Section 4.5 and



Baset, et al.             Expires May 22, 2008                 [Page 40]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Section 4.6, respectively.  It gathers its reachable addresses
   (Section 4.7.1.3) and sends a join request without setting the peer
   flag in the common header.  The peer receiving the join request may
   immediately reply with a 200 (Ok) request if it can support a new
   client.  It is up to the overlay implementer to decide how many
   clients may connect to a peer.  If a AP determines that it already
   has a certain number of clients, it replies with a 302 (Redirect)
   response containing a list of peers to which a client may send the
   join request.

   After receiving a 200 response to its join request, the client
   publishes its user-info as a resource-object object in the overlay.
   The resource-object types are defined in Section 13.  If the
   resource-object insertion is successful, the AP sends a 200 (Ok)
   response to the client and includes an Expires header.  The client
   then establishes a TCP connection with the AP and periodically send
   it a keepalive.  It sends all subsequent requests to its connected
   peer.

4.7.1.3.  NAT traversal

   A peer receiving a join request MUST include a resource-list object
   in its response indicating whether it is acting as a STUN or a TURN
   server.  A peer may then gather its ICE candidates.

   The recommended operation mode is that each peer acts as a STUN or
   TURN server.

4.7.2.  Leave

   A peer sends a Leave indication to gracefully inform its routing or
   neighbor peers about its departure.  It includes in the leave message
   a list of resource-objects the neighbor nodes should take over.  The
   peers receiving a leave message must update their routing or neighbor
   tables appropriately.

   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 client MAY also send a leave message to inform its peer(s) about
   its impending departure.

   (Open Issue: The user should not have to wait for the p2p application
   to shut down.  The p2p application is waiting for the receipt of
   Leave ACK.)





Baset, et al.             Expires May 22, 2008                 [Page 41]


Internet-Draft            Peer-to-Peer Protocol            November 2007


4.8.  Publish, LookupObject, LookupPeer

4.8.1.  Publish

   A node sends a publish request to a peer already in the overlay to
   publish a new resource-object or update an existing resource-object.
   A node typically sends a publish request in response to a usage layer
   API call.  The resource-object have a content-type and a sub-type;
   the commonly used types are User-Info, STUN, TURN, and STUN+TURN.
   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 publisher of the resource-object MUST also include information
   about its owner in the publish request because it may not necessarily
   be the owner of the resource-object.  It is possible for multiple
   owners to publish or update an existing resource-object, as a peer
   may be interested in retrieving the resource-object published or
   updated by a certain owner.

   Additionally, a publisher must ensure that the integrity of the
   resource-object is preserved.  It computes a digital signature over
   the whole resource-object, and includes the Signature object and its
   X.509 certificate as a sub-TLV of the resource-object.  The signature
   is encoded using PKCS#7.

   The format of the Owner TLV is left to the overlay implementer.  It
   can be a user-ID or a peer-ID.  (TODO: can we leave it to the overlay
   implementer?)

   A peer generating a 200 (Ok) response to a Publish request MUST
   include an Expires header.  The publisher of the resource-object MUST
   reissue the Publish request before the passage of time in Expires.

   A peer storing the resource-object MUST store the object signature
   and X.509 certificate of the resource publisher.

4.8.2.  LookupObject

   A node issues a LookupObject request to retrieve a resource-object
   from the overlay.  It sets the content-type, sub-type, and
   resource-ID fields in the Rlookup TLV.  Additionally, it may set the
   owner field in RLookup TLV.

   A peer receiving the LookupObject request must include in its 200
   response the certificate of the object publisher.  If multiple owners
   had published data under the resource-ID being searched, and if the
   owner is not specified, the peer storing the resource-object includes



Baset, et al.             Expires May 22, 2008                 [Page 42]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   all objects in its response.

   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 query originator, on
   receiving this response, reissues the LookupObject request over TCP
   to the peer responsible for the resource-object.

   The peer generating a 200 response for a LookupObject request MUST
   include the X.509 certificate of the publisher in its response.

4.8.3.  LookupPeer

   A peer issues a LookupPeer request to discover another peer in the
   overlay.  For example, in Bamboo [22], a peer uses global tuning and
   local tuning to update its routing table.  In these methods, a peer
   issues a lookup on an identifier which has L digits in common with
   peer-ID but differs in the (L+1)st digit (global tuning), or
   periodically contacts a random member of its routing table and
   requests all members at a certain level (local tuning).  To
   accomplish this, a peer can issue a LookupPeer request.  (TODO:
   reword)

   A peer can issue a LookupPeer request to locate a single peer,
   multiple peers or range of peers.  The 'Num' field controls the
   maximum number of peer-info objects returned in the response.

4.9.  Maintenance

   A peer performs various maintenance operations to maintain links with
   other peers in the overlay.  The maintenance operations use the
   messages provided by P2PP to maintain links with other peers in the
   overlay.  This involves the following two operations:

   1.  KeepAlive to neighbor and routing peers after the expiry of KAT
       timer.

   2.  Periodic update of neighbor and routing tables after the expiry
       of RMT and NMT timer.

   A client sends a periodic keepalive to its peer to maintain its link
   with the peer.

   P2PP provides three messages namely, KeepAlive, ExchangeTable, and
   LookupPeer for overlay maintenance.  KeepAlive is used to determine
   the liveness of the destination peer; ExchangeTable is used to obtain
   the routing and/or neighbor table of the peer; and LookupPeer is used
   to search for a specific peer to fill a routing-table entry.  The



Baset, et al.             Expires May 22, 2008                 [Page 43]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   transmission of these requests is governed by timers in
   Section 4.9.1.  Additionally, a receipt of a message from a neighbor
   or routing peer results in updating its keepalive timer.  It is up to
   the overlay implementer to adjust the values of these timers.

   The maintenance algorithms are DHT specific and are specified in a
   separate draft (TODO).  However, the messages to accomplish
   maintenance operations are defined in this draft.

4.9.1.  Node Timers

   This section defines node-specific timers for overlay maintenance and
   ExchangeTable requests.  The timer values are only provided as a
   reference.  The overlay implementer is free to choose a suitable
   value depending on the system requirements.

   Timer   Value    Description
   ---------------------------------
   KAT      10s     KeepAlive timer
   RMT      30s     Routing-table maintenance timer
   NMT      30s     Neighbor-table maintenance timer
   RT       30s     Replication management timer
   RRT      Var.    Resource refresh timer
   RA       10s     Start of range-time for message transmission
   RB       30s     End of range-time for message transmission

   (TODO: a separate draft for overlay maintenance operations)

4.10.  Replication

   The replication mechanism describes how resource-objects are
   replicated in the overlay.  It is necessary to replicate resource-
   objects in the overlay to maintain their availability during churn.
   Resource-objects can be replicated by the publisher or by the node at
   which they are stored.  The number of replicas depends on the
   availability requirements.

   Either the node which publishes the resource or the node at which the
   resource-object is stored can initiate replication.  P2PP provides a
   replicate request to replicate a group of resource-objects.

   The replication process is triggered after the expiry of RT
   (replication management timer).  If there has not been any change in
   the routing or neighbor table of a peer, there is no need to
   replicate.






Baset, et al.             Expires May 22, 2008                 [Page 44]


Internet-Draft            Peer-to-Peer Protocol            November 2007


4.11.  Capabilities and Diagnostics

   (TODO: This section needs to be elaborated.)

   P2PP provides a mechanism to allow nodes with heterogeneous
   capabilities to exchange their capabilities and their current
   resource utilization.  Nodes exchange their resource-utilization and
   their capabilities during maintenance and at join.  Nodes should
   exchange capabilities when establishing communication for the first
   time.  The capabilities and diagnostic information is included as
   part of Peer-Info object.

   P2PP provides a GetDiagnostic request message.  Peers can use this
   message to send their current capabilities and diagnostic information
   to another peer or a central server.  This is useful for debugging
   purposes.

   Peers can use Query request (Section 8.9 to explicitly request the
   capabilities of another peer.
































Baset, et al.             Expires May 22, 2008                 [Page 45]


Internet-Draft            Peer-to-Peer Protocol            November 2007


5.  P2PP Processing

5.1.  Resources and Services

   The resource-object represents the resources a node is responsible
   for or the services it may provide.  A resource-object has a type, a
   sub-type, a resource-ID, and a value.  It has additional attributes,
   namely, owner, expires, signature, peer-info, and X.509 certificate.
   The type and sub-type identify the type of resource-object that is
   being published or searched.  The resource-ID represents a searchable
   identifier for a resource or a service and is qualified by the type
   and sub-type fields.  It is possible for different resource-objects
   and services to have the same resource-ID (representing a
   discoverable identifier), but a different type and sub-type.  Thus,
   type and sub-type represent a unique namespace in the system.  The
   peer-info represents the publisher of the resource-object.

   It is possible for a peer or a set of peers to provide the same
   service.  Many peers may be interested in using the service provided
   by different peers.  The protocol should provide a mechanism for
   peers to publish their service information, to discover the peers
   providing the same service and to judiciously balance the load on the
   service peers.  We discuss four different ways in which a peer can
   advertise their service information for appropriate discovery by
   interested peers.

   Standard Service Name: All peers use a standard service name to
   advertise the same service.  The standard service name represents a
   discoverable identifier and is published in resource-ID field of the
   resource-object.  In structured networks such as DHTs, keys are
   stored against identifiers.  If a standard service name was used, it
   will always hash to a particular value.  The information about all
   peers providing the same service will be stored at a peer with an
   identifier closest to the hash value of a service name.  A peer which
   happens to have a peer-ID that is closest in the DHT sense to the
   hash of the service name will end up storing information about all
   peers providing this service, and will need to replicate it to
   neighbor peers for availability.  In a large system where hundreds or
   thousands of peers may provide the same service, this scheme
   overburdens the storage and bandwidth capacity of the peer
   responsible for this information.

   ReDiR: ReDiR is a mechanism proposed by OpenDHT [10] that addresses
   the issues discussed above.  ReDiR proposes to build a two-
   dimensional quad-tree of the nodes that have joined under a key and
   embeds them in the DHT using Publish/LookupObject interface.  Using
   this tree, ReDiR performs lookup in logarithmic number of operations
   and based on past lookups, it can reduce the average lookup to a



Baset, et al.             Expires May 22, 2008                 [Page 46]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   constant number of operations.  To publish its service advertisement,
   a node picks a random level l, and computes a hash of service name
   and l H(service_name,l).  If node(s) providing the service exist at
   this level, it recomputes H(service_name,l+1) and searches for the
   next level.  It then publishes its service information at the next
   available level.

   Random Id: Another mechanism to prevent service advertisement and
   lookup requests always going to a certain peer is to pick k random
   identifiers and publish the service advertisement under those random
   identifiers.  A node searching for a peer providing a certain service
   picks up a random identifier and searches it in the overlay for
   corresponding service name.  The idea is that it will likely hit upon
   a node which provides this service if a sufficient number of
   advertisements were published in the overlay.

   Random Walk and Learning: One option is not to explicitly publish
   information about the nodes providing the service and instead spread
   this information implicitly.  A node must have a routing table and
   may have a neighbor table.  The routing and neighbor peers of a node
   inform it about the list of services they are providing in a
   Resource-List TLV.  Since a node's routing table may contain few
   hundred (realistic?) entries, it is possible that some of them may
   provide the service.  A node searching for a peer providing certain
   service performs a random walk over its routing or neighbor peers
   till it finds an appropriate peer.

   Note that the first three schemes are geared towards DHTs while the
   last scheme is applicable to unstructured networks.  The resource
   (service) publishing and discovery uses the APIs provided the
   underlying peer protocol and is not tied to the underlying peer
   protocol.  The peers can also learn about the nodes providing a
   certain service as a side effect of other messages received.  This is
   exactly what random walk and learning scheme achieves.

5.2.  NAT Traversal

   The easiest and simplest way solve NAT traversal issues in a global
   deployment is to only allow nodes with unrestricted network
   connectivity to become peers.  In such a scenario, all peers act as
   STUN and TURN servers.  This is however not realistic on the Internet
   as is or applicable for P2PSIP providers that cannot afford large
   numbers of public peers required to support large overlays.  Thus,
   P2PP allows peers behind NATs to participate in the overlay.

   The following issues are related to NAT traversal.





Baset, et al.             Expires May 22, 2008                 [Page 47]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   1.  Publishing and discovery of NAT traversal service in the overlay.

   2.  Gathering of candidates and NAT behavior discovery.

   3.  Communicating with a peer behind a NAT.

   4.  Maintenance of NAT bindings.

   5.  Load balancing

5.2.1.  NAT Traversal Service Advertisement and Discovery

   P2PP allows peers to provide NAT traversal service.  Peers providing
   such a service publish this information in the overlay may use one of
   the four mechanism described in Section 5.1.  Additionally, for
   structured overlays, peers may use hash of the autonomous system
   number of their host or server-reflexive IP address as a resource-ID.

   It is possible for peers at various NAT levels to offer STUN and TURN
   service.  Peers behind p2p-friendly NATs may also provide STUN and
   TURN service [25].

5.2.2.  Gathering of Candidates and NAT Behavior Discovery

   At join, a JP searches for an appropriate peer providing STUN or TURN
   server in the overlay using LookupObject request.  It then gathers
   its host, server-reflexive, and relay candidates using the discovered
   peers.  Note that the relay candidate is used for relaying P2PP
   messages.  A JP may also use NAT behavior discovery mechanisms
   defined in [24] to discover the type of NAT it is behind.  A JP may
   use this information to determine if it should join as a peer or a
   client (although this is not recommended by [24].  Alternatively, the
   AP (admitting peer) decides based on the gathered candidates whether
   JP satisfies the overlay implementer guidelines for a peer.

   It is impossible to determine uptime guarantees for a peer providing
   a STUN or TURN service.  A peer should keep a list of peers providing
   STUN or TURN service and may maintain and advertise more than one
   server-reflexive and relay candidates.

5.2.3.  Communicating with a Peer Behind a NAT

   The choice of recursive or iterative routing has an impact on the
   mechanisms to communicate peers behind a NAT.  If a all nodes in the
   overlay use recursive routing, then under low churn they only need to
   communicate with their routing and neighbor peers.  The nodes behind
   NATs can form a communication channel with their routing and neighbor
   peers by exchanging their gathered candidates in a Connect request



Baset, et al.             Expires May 22, 2008                 [Page 48]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   and response.

   The situation changes when the overlay has moderate or heavy churn or
   uses iterative routing.  During these circumstances, a peer behind a
   NAT may need to communicate with other peers only once; and it may
   never subsequently communicate with them.  Since these peers have
   published their host, server-reflexive, and relay candidates in the
   overlay, a peer intending to communicate with them simply sends a
   copy of the message to these addresses.

5.2.4.  Maintenance of NAT Bindings

   A peer sends the STUN Binding request to maintain NAT bindings.

5.2.5.  Load Balancing for Media Flows

5.2.6.  ICE Overhead

   ICE is geared towards establishing long-lived sessions.  In a typical
   ICE usage scenario, a peer planning to establish communication with
   other peers gathers its address candidates and sends them in an offer
   to the remote peer.  The assumption is that a peer is unaware of the
   address candidates of the remote peer and they must exchange this
   information and discover the address candidates best suitable for
   subsequent exchange.

   In P2PP, peers gather their address candidates at join and publish
   them in the overlay.  Further, a node will have all the address
   candidates for peers in its routing table or neighbor table.  When a
   user-info object is published, all the address-candidates are also
   published along with it.  Thus, when a user-info object is retrieved
   or a peer-info object is in returned in a 302 response, they will
   contain all the address candidates of the peer.  A peer forwarding
   requests in an iterative manner can simply send copies of the message
   to all the address candidates of the peer.  If subsequent
   communication is desired, then the address candidates be
   appropriately pruned.

   TODO: Discuss below.

   Encoding overhead: User and password, foundation and component-id
   size.  P2PP ICE encoding removed user password, and reduced
   foundation and comp-id size.

   TURN message exchange overhead: Allocate an address and then create
   permissions in a separate message.





Baset, et al.             Expires May 22, 2008                 [Page 49]


Internet-Draft            Peer-to-Peer Protocol            November 2007


5.3.  Route Log

   TODO: Only needed for recursive routing.

5.4.  P2PP and SIP

   SIP [2] messages to peers with restricted connectivity are tunneled
   through peers with unrestricted connectivity.  The SIP message is
   encapsulated in a resource-object and is sent to the peer responsible
   for the node with restricted connectivity.









































Baset, et al.             Expires May 22, 2008                 [Page 50]


Internet-Draft            Peer-to-Peer Protocol            November 2007


6.  Transport Layer

   This section defines mechanisms for reliably delivering a message to
   the next hop.  For requests, a transaction constitutes of a single
   request followed by acknowledgements (if any), and a response.  For
   responses, reponseACKs, and indications, a transaction consists of
   single response, responseACK, or indication, followed by an ACK if
   unreliable transport is used.  Section 3.4 and Section 3.5 discussed
   the need for acknowledgements and responseACKs.

6.1.  Transaction Identifier

   A transaction is identified by a source-ID, transaction-ID tuple, and
   a transaction-type triple.  This is used to match acknowledgements
   (ACK) to requests, responses and indications.  However, the responses
   and responseACKs are matched to requests using only source-ID and
   transaction-ID tuple.  A transaction can be of four types, namely,
   request, response, responseACK, or an indication.  The source-ID,
   transaction-ID, and transaction-type must be preserved in the ACKs.
   Each request or indication has a locally unique 32-bit
   transaction-ID.

6.2.  Message State Machine

   This section defines state machine for unreliable and unreliable
   transports.

6.2.1.  State Machine for Unreliable Transports

   For unreliable transports, the transaction state machine for requests
   is shown in Figure 8 whereas state machine for responses and
   indications is shown in Figure 9.

   The "Trans_Msg" (abbreviation for transmit message) state is entered
   when a peer sends a request, response, responseACK, or an indication.
   When entering this state, the transaction should set timer T1 and T2.
   Timer T1 governs retransmissions and is updated after ith
   retransmission as follows: T1=2^i*T0.  If timer T2 fires, the state
   machine transitions to "Failed" state and is terminated.

   If a request was sent and an acknowledgement was received, the state
   machine transitions to "Wait_Resp" state.  When entering this state,
   the transaction should set timer T3.  If timer T3 fires, the state
   machine transitions to "Failed" state and is terminated.  If a
   responseACK was received, the transaction sends an ACK and is
   terminated.

   If a response, responseACK, or an indication was sent and ACK was



Baset, et al.             Expires May 22, 2008                 [Page 51]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   received, the state-machine immediately transitions to the
   "Terminated" state.


                         +-----------+
                         |           |
                         |  Initial  |
                         |           |
                         +-----------+
                               |
                               | tx_Msg / set Timer T1 and T2
   Timer T1 fires  /           |
    T1=2^i*T0                  V              Transport Err. or
     tx_Msg              +------------+       Timer T2 fires
                  +------|            |       Inform App.
                  |      | Trans_Msg  |----------------->+
                  +----->|            |                  |
                         +------------+                  |
                           |   | ACK received /          |
    +----------------------+   | set Timer T3            |
    |                          | stop Timer T1, T2       |
    |                          V                         |
    |                    +-----------+ Transport Err.    |
    | responseACK rcvd / |           | or Timer T3 fires |
    | stop Timer T1, T2  | Wait_Resp |------------------>|
    | send ACK           |           |                   |
    |                    +-----------+                   |
    |                          |                         |
    |                          | Resp received /         |
    |                          | send ACK                |
    |                          V                         |
    |                    +------------+                  |
    |                    |            |                  |
    +------------------->| Terminated |                  |
                         |            |                  |
                         +------------+                  |
                                                         |
                         +-----------+                   |
                         |           |                   |
                         |  Failure  |<------------------+
                         |           |
                         +-----------+

   Figure 8: Transaction state machine for requests for unreliable
   transport






Baset, et al.             Expires May 22, 2008                 [Page 52]


Internet-Draft            Peer-to-Peer Protocol            November 2007


                         +-----------+
                         |           |
                         |  Initial  |
                         |           |
                         +-----------+
                               |
                               | tx_Msg / set Timer T1 and T2
   Timer T1 fires  /           |
    T1=2^i*T0                  V              Transport Err. or
     tx_Msg              +------------+       Timer T2 fires
                  +------|            |       Inform App.
                  |      | Trans_Msg  |----------------->+
                  +----->|            |                  |
                         +------------+                  |
                               |                         |
                               | ACK received            |
                               | stop Timer T1, T2       |
                               V                         |
                         +------------+                  |
                         |            |                  |
                         | Terminated |----------------->|
                         |            |                  |
                         +------------+                  |
                                                         |
                         +-----------+                   |
                         |           |                   |
                         |  Failure  |<------------------+
                         |           |
                         +-----------+

   Figure 9: Transaction state machine for responses and indications for
   unreliable transport

6.2.2.  State Machine for Reliable Transports

   For reliable transports, the transaction state machine for requests
   is shown in Figure 10; the state machine for responses and
   indications is shown in Figure 11.

   The "Trans_Msg" state is entered, when a peer issues or forwards the
   request, response, or an indication.  If the message was a response
   or an indication and was successfully sent, the state machine
   transitions to "Terminated" state.  If the message was a request and
   was successfully sent, the transaction sets Timer T3 and transitions
   to "Wait_Resp" state.  If a response is received, the transaction is
   terminated.  No ACK is sent for requests, responses, and indications
   sent over reliable transport.  Similarly, no responseACK is generated
   for a request.



Baset, et al.             Expires May 22, 2008                 [Page 53]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   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 application MAY terminate
   the reliable transport connection if it does not anticipate its
   reuse.


                         +-----------+
                         |           |
                         |  Initial  |
                         |           |
                         +-----------+
                               |
                               | tx_Msg
                               |
                               V
                         +------------+       Transport Err.
                         |            |       Inform App.
                         | Trans_Msg  |----------------->+
                         |            |                  |
                         +------------+                  |
                               | Msg successfully sent / |
                               | set Timer T3            |
                               |                         |
                               V                         |
                         +-----------+ Transport Err.    |
                         |           | or Timer T3 fires |
                         | Wait_Resp |------------------>|
                         |           |                   |
                         +-----------+                   |
                               |                         |
                               | Resp received           |
                               |                         |
                               V                         |
                         +------------+                  |
                         |            |                  |
                         | Terminated |                  |
                         |            |                  |
                         +------------+                  |
                                                         |
                         +-----------+                   |
                         |           |                   |
                         |  Failure  |<------------------+
                         |           |
                         +-----------+

   Figure 10: Transaction state machine for requests for a reliable
   transport



Baset, et al.             Expires May 22, 2008                 [Page 54]


Internet-Draft            Peer-to-Peer Protocol            November 2007


                         +-----------+
                         |           |
                         |  Initial  |
                         |           |
                         +-----------+
                               |
                               | tx_Msg
                               |
                               V
                         +------------+       Transport Err.
                         |            |       Inform App.
                         | Trans_Msg  |---------------+
                         |            |               |
                         +------------+               |
                               |                      |
                               | Msg successfully sent|
                               V                      |
                         +------------+               |
                         |            |               |
                         | Terminated |               |
                         |            |               |
                         +------------+               |
                                                      |
                                                      |
                         +-----------+                |
                         |           |                |
                         |  Failure  |<---------------+
                         |           |
                         +-----------+

   Figure 11: Transaction state machine for responses and indications
   for a reliable transport

6.3.  Timers

   This section defines timers for message state machines.


   Timer    Value
   ----------------------
   T0       500 ms
   T1       T0
   T2       5s
   T3       5s







Baset, et al.             Expires May 22, 2008                 [Page 55]


Internet-Draft            Peer-to-Peer Protocol            November 2007


7.  Security Considerations

7.1.  Routing Security

7.1.1.  Peer-ID Assignment

   In P2PP, user-IDs and peer-IDs are assigned in a centralized and
   secure manner.  This provides protection against Sybil attacks [23].
   The user-IDs are typically chosen by a user at the time of enrollment
   and peer-IDs are chosen in a manner which preserves their uniqueness
   across different network environments such as NAT.  During enrollment
   and/or authentication, a node sends its peer-ID and user-ID in a DER
   encoded certificate signing request (CSR) to a central trusted
   authority, typically the entity providing overlay software.  If
   approved, the CA responds with a DER encoded X.509 signed
   certificate, which binds the public key of the node to the user-ID
   and peer-ID.  Peers and clients must enroll themselves before
   participating in the overlay.  Section 4.5 discusses the enrollment
   process.

   There are circumstances in which a central trusted authority may not
   be available or has a significant establishment overhead.  The
   examples are overlays setup for a meeting or in a small office
   environment.  One of the peers, typically the first peer in the
   overlay, may act as a central authority.  Additionally, self-signed
   certificates may be used.  (TODO: Can we deprecate this mechanism?)

7.1.2.  Message Forwarding and Message Integrity

   P2PP provides protection against routing threats (2)-(4) by sending
   and forwarding messages over secure and [un]reliable transports,
   namely, DTLS or TLS.  Message integrity is also provided by these
   transports.  P2PP provides protection against (4) by only a hash
   identifier of a user-ID in its certificate or messages.

7.1.3.  Routing and Neighbor Table Management

   Despite secure ID assignment and message forwarding, the peers can be
   compromised in an overlay.  An attacker with a secure ID performing
   secure forwarding can poison the routing and neighbor tables of non-
   faulty nodes.  (TODO: Use schemes in various p2p security papers.  Is
   there a need to standardize it?)

7.1.4.  Admission Control

   TBD.





Baset, et al.             Expires May 22, 2008                 [Page 56]


Internet-Draft            Peer-to-Peer Protocol            November 2007


7.1.5.  Residual Attacks

   TBD.

7.2.  Storage Security

7.2.1.  Integrity

   P2PP provides protection against storage integrity threats by
   mandating peers to digitally sign a message in a PKCS#7 format (TODO:
   evaluate its overhead.)  Peers store their X.509 certificates with
   the stored data which allows nodes searching for the stored data to
   verify its integrity.

7.2.2.  Permissions

   TODO

7.2.3.  Quota

   TODO

7.2.4.  Residual Attacks

   TODO


























Baset, et al.             Expires May 22, 2008                 [Page 57]


Internet-Draft            Peer-to-Peer Protocol            November 2007


8.  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].

   P2PP defines eighteen messages as shown below.  The messages are
   grouped together by related functions they perform.

   P2PP-Msg = Enroll / Authenticate / Bootstrap /
              Join / Leave / KeepAlive /
              LookupPeer / ExchangeTable / Query
              Replicate / Transfer /
              Publish / LookupObject / RemoveObject /
              Tunnel / Connect
              Invite /
              GetDiagnostics

8.1.  Enroll

   Enrolls the user in the overlay.


   Enroll = Common-header
            [Request-Options]
            Peer-Info
            Certificate-Sign-Request
            Password


   Enroll (Resp) = Common Header
               Peer-Info
               X.509-Certificate
               [P2P-Options]
               [Peer-Info]*
               [Ext]

8.2.  Authenticate

   Authenticate the user and generates a certificate binding user-ID,
   peer or client ID, and public key of the peer.


   Authenticate = Common-header
            [Request-Options]
            Peer-Info
            Certificate-Sign-Request
            Password



Baset, et al.             Expires May 22, 2008                 [Page 58]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Authenticate (Resp) = Common Header
               Peer-Info
               X.509-Certificate
               [P2P-Options]
               [Peer-Info]*
               [Ext]

8.3.  Bootstrap

   A request sent by a peer or a client to a bootstrap server or peer to
   discover the IP address of a peer already in the overlay.


   Bootstrap = Common-header
             Peer-Info


   Bootstrap (Resp) = Common Header
               Peer-Info (bootstrap peer)
               Peer-Info (request originator)
               P2P-Options
               [Peer-Info]*
               [Ext]

   P2P-options = Hash-algorithm
              Hash-algorithm-length
              DHT-algorithm
              OverlayID-length
              Overlay-ID

8.4.  Join

   A request sent by a peer to join the overlay.  The join request sent
   by a client is not forwarded to other peers.


   Join = Common-header
        [Request-Options]
        Peer-Info












Baset, et al.             Expires May 22, 2008                 [Page 59]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Join (Resp) = Common Header
               Peer-Info
               [Peer-Info]*
               [Expires]
               [Routing-Table]
               [Neighbor-Table]
               [Ext]

   Routing-table = Num-entries
                 [Peer-Info]*

   Neighbor-peers = Num-entries
                  [Peer-Info]*

8.5.  Leave

   Peers send the leave indication to their routing and peers indicating
   their departure.  Clients periodically send the leave message to
   their respective peers.

   Leave = Common-header
         Peer-Info
         [Peer-Info]*
         [Resource-object]*

8.6.  KeepAlive

   Peers periodically send a keepalive indication to their routing and
   neighbor peers to check whether they are alive.  Clients send a
   keepalive to their peers to check whether they are alive.

   KeepAlive = Common-header
              Peer-Info
              Expires


   KeepAlive (Resp) = Common-header
                     Peer-Info
                     Expires

8.7.  LookupPeer

   Peers send this request to discover a peer that may fill or update a
   missing entry in their routing or neighbor table.

   LookupPeer = Common-Header
              [Request-Options]
              Peer-Info



Baset, et al.             Expires May 22, 2008                 [Page 60]


Internet-Draft            Peer-to-Peer Protocol            November 2007


              PLookup


   LookupPeer (resp) = Common-Header
                     Peer-Info
                     [Peer-Info]*
                     [Ext]

8.8.  ExchangeTable

   Peers periodically send this request to their routing and neighbor
   peers obtain their routing and neighbor tables.

   ExchangeTable = Common-Header
                 Peer-Info
                 Request-Options


   ExchangeTable (resp) = Common-Header
                        Peer-Info
                        [Routing-table]
                        [Neighbor-peers]
                        [Ext]

8.9.  Query

   Query a peer or a client to discover the services they provide or the
   resource-objects they store.

   Query = Common-Header
         Peer-Info


   Query (resp) = Common-Header
                Peer-Info
                [P2P-Options]
                [Resource-List]
                [Ext]

8.10.  Replicate

   Peers periodically send this request to replicate the resource-
   objects for availability.  The choice of peers on which to replicate
   the objects depends on the peer protocol.







Baset, et al.             Expires May 22, 2008                 [Page 61]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Replicate = Common-header
               Peer-Info
               [Resource-Object]*
               [Ext]

   Replicate (Resp) = Common-header
                    Peer-Info

8.11.  Transfer

   After a successful join or graceful or ungraceful failure of peers, a
   peer transfers the ownership of resource-objects using a transfer
   request.

   Transfer = Common-header
            Peer-Info
            [Resource-object]+
            [Ext]

   Transfer (Resp) = Common-header
                   Peer-Info

8.12.  PublishObject

   Publish a resource-object.  Also, used to refresh or update an
   existing resource-object.

   PublishObject = Common-header
           [Request-Options]
           Peer-Info
           Resource-Object


   Publish (Resp) = Common-header
            Peer-Info
            Expires

8.13.  LookupObject

   Search for a resource-object.

   LookupObject = Common-header
          [Request-Options]
          Peer-Info
          RLookup






Baset, et al.             Expires May 22, 2008                 [Page 62]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   LookupObject (resp) = Common-header
                 Peer-Info
                 Resource-Object

8.14.  RemoveObject

   Remove a resource-object.

   RemoveObject = Common-header
          [Request-Options]
          Peer-Info
          Resource-Object

   Remove (Resp) = Common-header
                 Peer-Info

8.15.  Tunnel

   Tunnel an application layer protocol message into a P2PP message.
   Mostly used for sending SIP messages to peers or clients behind a
   NAT.

   Tunnel = Common-header
          [Request-Options]
          Peer-Info
          Resource-Object

   Tunnel (Resp) = Common-header
                 Peer-Info

8.16.  Connect

   Send an ICE offer (TBD).

   Connect = Common-header
          [Request-Options]
          Peer-Info

   Connect (Resp) = Common-header
                 Peer-Info

8.17.  Invite

   Peers send an invite request to a client, inviting them to become a
   peer.






Baset, et al.             Expires May 22, 2008                 [Page 63]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Invite = Common-header
          Peer-Info

   Invite (Resp) = Common-header
                 Peer-Info














































Baset, et al.             Expires May 22, 2008                 [Page 64]


Internet-Draft            Peer-to-Peer Protocol            November 2007


9.  Packet Formats

   This section defines PDUs for the messages and their methods defined
   above.

9.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=2| T |A|P|R|    Reserved     | Request Type  |      TTL      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Magic Cookie                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Transaction-ID                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Message Length                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                         Source-ID                           //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Version (2 bits):  The protocol version number.  The current version
      is 1.

   T (2 bits):  Indicates the message type: (00) for a request, (01) for
      an indication, (10) for a response, (11) for a responsACK.

   A flag:  If set (A=1), the message is an acknowledgement for the
      request, response, responseACK, or an indication.  The A flag is
      never set for reliable transports.

   P flag:  If set (P=1), the message is sent by a peer.  Otherwise, a
      client sends the message.

   R flag:  If set (R=1), the request is sent in a recursive manner.
      Otherwise, it is sent in an iterative manner.  The flag is not set
      for responses or indications.

   Request or Indication Type (8 bits):  The request or indication
      message type such as join and leave.






Baset, et al.             Expires May 22, 2008                 [Page 65]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   TTL (8 bits):  A hop count for the number of peers this request can
      traverse.

   Magic cookie (32 bits):  A field with a fixed value (0x596ABF0D) to
      differentiate P2PP messages from other protocol messages such as
      STUN.

   Transaction-ID (32 bits):  A unique number to match responses with
      the originated requests.  Along with source-ID, it can uniquely
      identify a message in the system.

   Message Length (32 bits):  The byte length of the message after the
      common header itself.

   Source-ID (variable):  The Peer-ID of the peer of client sending the
      request.  For DHTs, it is the fixed length output of the hash
      function.  For unstructured networks, it is a fixed length
      identifier.  The length of this field is determined at Join.  For
      bootstrap and authenticate requests, its length is always four
      bytes.

   For responses, the rightmost 9-bits of the Reserved field contain the
   response code.  The response contains a destination-ID field, which
   is the peer-ID of the node generating the provisional or final
   response.

    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=2| T |A|P|R|  Response code  | Request Type  |      TTL      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Magic Cookie                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Transaction-ID                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Message Length                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                         Source-ID                           //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                        Response-ID                          //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      The Peer-ID of the peer or client sending the response.  For DHTs,
      it is the fixed length output of the hash function.  For
      unstructured networks, it is a fixed length identifier.  The
      length of this field is determined during bootstrap.  For
      responses to bootstrap and authenticate requests, its length is
      always four bytes.



Baset, et al.             Expires May 22, 2008                 [Page 66]


Internet-Draft            Peer-to-Peer Protocol            November 2007


9.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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Object-Type  |A|B| Reserved  |           Length              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                          Value                              //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Object-Type (8 bits):  An IANA-assigned identifier for the type of
      the object.

   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.

   Length (16 bits):  The byte length of the object.

   The combination AB=10 and AB=11 are reserved.

9.3.  P2PP TLV Objects

9.3.1.  Peer-Info

   Type:  Peer-Info

   Length:  Variable (depends on the length of Peer-ID, IP version and
      unhashed key if any.  The Peer-Info MUST include an address-info
      object or a peer-ID.  It may also include additional objects such
      as unhashed-ID, uptime, neighbor/resource utilization, and expires
      which defines the keepalive interval.  The peer issuing the
      request may not include its peer-ID in the peer-Info object as it
      is already included in the common header.  However, peers in the
      request path must include their peer-ID as well as address-info
      objects.

   Peer-ID:







Baset, et al.             Expires May 22, 2008                 [Page 67]


Internet-Draft            Peer-to-Peer Protocol            November 2007


    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                            //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Peer-ID (variable):  It is an identifier of the node (client or peer)
      issuing or forwarding the request.  For DHTs, it is a fixed-length
      output of a hash function.  For unstructured networks, it is also
      a fixed-length identifier.

   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                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Uptime (32 bits):  The uptime of this peer in number of seconds.

   Resource-List:

    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      |Resource-Type1 |Resource-Type2 |Resource-Type3 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Num (8 bits):  Number of resource-lists.

   Resource-Type (8 bits):  Same as Cont-Type in Resource-Info object.
      Typically, only included for the services such as STUN or TURN
      that the node is currently providing.

   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Num      |R|Resv.| IP-ver|   Foundation  | Component-ID  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Priority                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   TT  |   HT  |           Port                | Peer address //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+





Baset, et al.             Expires May 22, 2008                 [Page 68]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Num (4 bits):  Number of ICE candidates.

   R flag:  If set, rel-addr and rel-port are included as defined in ICE
      [7].

   IP-Ver (4 bits):  The IP version number, 4 or 6.

   Foundation (8 bits):  The foundation field as defined by ICE.  Note
      that the length of this field is only 8-bits as compared to 64-
      bits as defined by ICE specification.

   Component-ID (8 bits):  The component-ID field as defined by ICE.

   Priority (32 bits):  The priority of the address obtained through
      ICE.

   TT (4 bits):  The transport type of the address.  One of UDP (0000),
      or TCP (0001).

   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).

   Port (16 bits):  The port on which this peer listens for requests.

   Peer Address (variable):  The IP address of the peer.  Its length
      depends on the IP-Ver field.

9.3.2.  Unhashed-Id

   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 a user, resource, or peer
      identifier. this peer.  This is only included in a DHT-based
      overlay.

9.3.3.  Request-Options








Baset, et al.             Expires May 22, 2008                 [Page 69]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |P|R|N|E|A|S|L|                                                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   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 either in a response
      or in a separate ExchangeTable request.  The transmission of the
      routing-table copy is governed by the in-separate-request (E flag)
      and partial-copy (A flag) flags.

   N (1 bit) request-neighbor-table:  If set (N=1), send a copy of the
      neighbor table to the peer issuing the request in a response or
      ExchangeTable request.  The transmission of routing-table copy is
      governed by the in-separate-request and partial-copy flags.

   E (1 bit) in-separate-request:  If set (E=1), and if R or N are also
      set, the peer is requesting to receive routing or neighbor table
      in an ExchangeTable request.  If not set (E=0), and if R or N are
      also set, each peer along the request path can add a copy of its
      routing or neighbor table before forwarding the response.  The
      number of entries in all routing-tables should not exceed 256.
      Peers along the request path may remove routing-table entries
      added by a previous hop, if their own routing-tables have a better
      performance metric (such as uptime) than the ones received in the
      message.  The size of routing-table is likely to exceed UDP MTU.
      The specification recommends that the ExchangeTable request should
      always be sent over TCP.

   A (1 bit) partial-reply for routing or neighbor table:  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 ExchangeTable request.  The number of entries
      in all neighbor-tables should not exceed 256.






Baset, et al.             Expires May 22, 2008                 [Page 70]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   S (1 bit):  If set (S=1), the request is being sent to the immediate
      neighbors of the newly joining peer.  The request must be a join
      request.

   L (1 bit):  If set (L=1), each peer along the request must add its
      peer-info object that includes peer-ID, address-info, and
      resource-list objects.

9.3.4.  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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Hash-Algorithm |H-Algorithm-Len| P2P-Algorithm |      Base     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | OverlayID Len |           Overlay-ID                         //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Hash-Algorithm (8 bits):  An IANA-assigned identifier for the hash
      algorithm.

   H-Algorithm-Len (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.

   Base:  The base for hash algorithms.  It is set to zero for
      unstructured overlays.

   OverlayID-Length (8 bits):  The byte length of overlay-ID.

   Overlay-ID (variable):  Overlay-ID.

9.3.5.  Routing-Table

   Type:  Routing-Table

   Length:  Variable (depends on the number of Peer-Info objects)







Baset, et al.             Expires May 22, 2008                 [Page 71]


Internet-Draft            Peer-to-Peer Protocol            November 2007


    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 routing
      table.

   Peer-Info (variable):  One or more Peer-Info objects.

9.3.6.  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.

9.3.7.  PLookup

   Type:  PLookup

   Length:  Variable (depends on the length of Peer-ID and whether this
      is a range lookup)










Baset, et al.             Expires May 22, 2008                 [Page 72]


Internet-Draft            Peer-to-Peer Protocol            November 2007


    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    |E|R|              Peer-IDa                        //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                             Peer-IDb                        //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Num (6 bits):  Number of peers to look for.

   E (1 bit):  If set (E=1), then search for a peer whose peer-ID is the
      same as peer-IDa.  Otherwise, return up to Num peers whose ID is
      'closest' to Peer-IDa

   R (1 bit):  If set (R=1), then it is a range lookup.  It is only set,
      if E is not set.

   Peer-IDa (variable):  Peer-ID.  The length of Peer-ID is determined
      at join.

   Peer-IDb (variable):  Peer-ID.  The length of Peer-ID is determined
      at join.

9.3.8.  Resource-ID

   Resource-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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                         Resource-ID                         //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Resource-ID (variable):  It is an identifier of the resource.  For
      DHTs, it is a fixed-length output of a hash function.  For
      unstructured networks, its length is variable.

9.3.9.  RLookup

   Type:  Resource-Object

   Length:  Variable (depends on the size of resource-object)









Baset, et al.             Expires May 22, 2008                 [Page 73]


Internet-Draft            Peer-to-Peer Protocol            November 2007


    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Cont-type   |   Sub-Type    |         Resource-ID          //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Additional Information                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Cont-type:  An IANA assigned identifier for the type of content
      contained in this resource-object.

   Sub-type:  An IANA assigned identifier which further classifies the
      content type as defined by cont-type.

   Resource-ID (variable):  The Resource-ID TLV of the resource object.

   Additional Information:  Owner

9.3.10.  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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Cont-type   |   Sub-Type    |         Resource-ID          //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                    Resource-Object-Value                    //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Additional Information                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Cont-type:  An IANA assigned identifier for the type of content
      contained in this resource-object.

   Sub-type:  An IANA assigned identifier which further classifies the
      content type as defined by cont-type.

   Resource-ID (variable):  The Resource-ID TLV of the resource object.

   Resource-Object-Value (variable):  Variable length.  Its value
      depends on the content-type and sub-type.






Baset, et al.             Expires May 22, 2008                 [Page 74]


Internet-Draft            Peer-to-Peer Protocol            November 2007


9.3.10.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.

   Signature (Variable):  The cryptographic signature of the resource-
      object.

   X509 (fixed):  The X509 certificate of the peer publishing the
      resource-object.

9.3.11.  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

9.3.12.  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.







Baset, et al.             Expires May 22, 2008                 [Page 75]


Internet-Draft            Peer-to-Peer Protocol            November 2007


9.3.13.  Certificate

   An X.509 certificate.

   Type:  Certificate

   Sub-Type:  Self-Signed (0x00), Server-Signed (0x01).

   Length:  Variable.  Depends on the size of X.509 certificate.


    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                         Certificate                         //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Certificate (variable):  The length of X.509 certificate.

9.3.14.  Signature

   The signature of the resource-object.

   Type:  Signature

   Length:  Variable.  Depends on the type of signature algorithm being
      used.


    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   //                         Signature                           //
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Signature (variable):  The signature length of resource-object.

9.3.15.  Capabilities and Diagnostics

   Time Window:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Time Window                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+





Baset, et al.             Expires May 22, 2008                 [Page 76]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Time Window (32 bits):  The elapsed time in seconds since the
      gathering of message statistics.  This can be included as part of
      every diagnostic TLV.

   AS Number:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Autonomous System Number                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Autonomous System Number (32 bits):  The autonomous system of node's
      IP address, if available.

   Connections:

    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 Neighbor Peers     |   Number of Routing Peers   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Number of clients            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Number of Neighbor Peers (16 bits):  The number of neighbor peers of
      this peer.

   Number of Routing Peers (16 bits):  The number of routing peers of
      this peer.

   Number of Clients (16 bits):  The number of clients connected with
      this peer.

   Node-Resource-Utilization:

    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 bandwidth                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   CPU Util.   |   BW. Util.   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+








Baset, et al.             Expires May 22, 2008                 [Page 77]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Peer Bandwidth (32 bits):  Estimated peer bandwidth in kilo bits per
      second.  This is tricky to determine and is TBD.

   CPU Utilization (8 bits):  CPU Utilization of this peer on a scale of
      1 to 100.  Represent the percentage of CPU being used.  If should
      be an average over the last five seconds.

   Bandwidth Utilization (8 bits):  Bandwidth utilization of this peer
      on a scale of 1 to 100.  Represent the percentage of bandwidth
      being used.  It should be an average over the last five seconds.

   Messages-Received:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Msg Type    |           Number of messages                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       ......                                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Msg Type (8 bits):  The message types as defined in Section 13.  The
      number 254 is reserved for responses and 255 for ACKs.

   Number of messages (24 bits):  The number of messages received for
      the 'msg type' since the elapsed time.

9.4.  Response Codes and Errors

9.4.1.  Response Codes

   There are four different types of response codes.  They are no
   provisional response codes.  The description is given below:

   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.

9.4.1.1.  2xx (Successful) Responses







Baset, et al.             Expires May 22, 2008                 [Page 78]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   200 Ok.   A successful answer to the request.

9.4.1.2.  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.

9.4.1.3.  4xx-511 (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.

9.4.2.  Error Object

   TBD.















Baset, et al.             Expires May 22, 2008                 [Page 79]


Internet-Draft            Peer-to-Peer Protocol            November 2007


10.  Application Layer

   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.

10.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)

10.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.

10.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.

10.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.

10.5.  Remove

   Remove([in]Resource-ID)

   An application uses this API to explicitly remove a resource-object
   from the overlay.





Baset, et al.             Expires May 22, 2008                 [Page 80]


Internet-Draft            Peer-to-Peer Protocol            November 2007


10.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, et al.             Expires May 22, 2008                 [Page 81]


Internet-Draft            Peer-to-Peer Protocol            November 2007


11.  Open Issues

   1.   Mandatory DHT: P2PP supports bamboo but elaborate.

   2.   SIP record insertion and lookup.

   3.   ICE overhead analysis for recursive and iterative routing and in
        the presence of churn.

   4.   Redirecting media relaying requests.

   5.   Overlay migration.

   6.   Reactive vs. periodic maintenance.

   7.   How can a node estimate its CPU and bandwidth utilization?

   8.   Non-SIP usage of P2PP

   9.   Secure protocol for iterative routing.

   10.  HTTP authentication.





























Baset, et al.             Expires May 22, 2008                 [Page 82]


Internet-Draft            Peer-to-Peer Protocol            November 2007


12.  Acknowledgements

   The authors will like to thank the following (in alphabetical order)
   for their helpful comments and suggestions.  Christian Schmidt,
   Christian Dickmann, Miguel Garcia, Jae W. Lee, Esko Kokkonen, Kundan
   Singh, Henry Sinnreich, Eunsoo Shim and Marc Willekens.













































Baset, et al.             Expires May 22, 2008                 [Page 83]


Internet-Draft            Peer-to-Peer Protocol            November 2007


13.  IANA Considerations

   Listening Port:  The port on which a peer listens for request.  The
      current implementation uses 7080 for UDP and TCP and 7081 for DTLS
      and TLS.

   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
      and indication messages.

                     +--------------+----------------+
                     | Message Type | Message        |
                     +--------------+----------------+
                     | 0            | Enroll         |
                     |              |                |
                     | 1            | Authenticate   |
                     |              |                |
                     | 2            | Bootstrap      |
                     |              |                |
                     | 3            | Join           |
                     |              |                |
                     | 4            | Leave          |
                     |              |                |
                     | 5            | KeepAlive      |
                     |              |                |
                     | 6            | LookupPeer     |
                     |              |                |
                     | 7            | ExchangeTable  |
                     |              |                |
                     | 8            | Query          |
                     |              |                |
                     | 9            | Publish        |
                     |              |                |
                     | 10           | LookupObject   |
                     |              |                |
                     | 11           | RemoveObject   |
                     |              |                |
                     | 12           | Replicate      |
                     |              |                |
                     | 13           | Transfer       |
                     |              |                |
                     | 14           | Tunnel         |
                     |              |                |
                     | 15           | Connect        |
                     |              |                |
                     | 16           | GetDiagnostics |
                     +--------------+----------------+



Baset, et al.             Expires May 22, 2008                 [Page 84]


Internet-Draft            Peer-to-Peer Protocol            November 2007


   Object Types:  There is a one byte field in the object header.  The
      following values for object types are defined by this
      specification.

                  +-------+-----------------------------+
                  | OType | Object Type                 |
                  +-------+-----------------------------+
                  | 0     | Peer-Info                   |
                  |       |                             |
                  | 1     | Peer-ID                     |
                  |       |                             |
                  | 2     | Address-Info                |
                  |       |                             |
                  | 3     | Unhashed-ID                 |
                  |       |                             |
                  | 4     | Uptime                      |
                  |       |                             |
                  | 5     | P2P-Options                 |
                  |       |                             |
                  | 6     | Request-Options             |
                  |       |                             |
                  | 7     | Diagnostic-Options          |
                  |       |                             |
                  | 8     | Routing-Table               |
                  |       |                             |
                  | 9     | Neighbor-Table              |
                  |       |                             |
                  | 10    | PLookup                     |
                  |       |                             |
                  | 11    | Resource-ID                 |
                  |       |                             |
                  | 12    | RLookup                     |
                  |       |                             |
                  | 13    | Resource-Object             |
                  |       |                             |
                  | 14    | Expires                     |
                  |       |                             |
                  | 15    | Owner                       |
                  |       |                             |
                  | 16    | Certificate-Signing-Request |
                  |       |                             |
                  | 17    | X.509-Cer7-Signature        |
                  |       |                             |
                  | 19    | Time-Window                 |
                  |       |                             |
                  | 20    | Connections                 |
                  |       |                             |
                  | 21    | Node-Resource-Utilization   |



Baset, et al.             Expires May 22, 2008                 [Page 85]


Internet-Draft            Peer-to-Peer Protocol            November 2007


                  | 22    | Messages-Received           |
                  |       |                             |
                  | 23    | AS-Number                   |
                  |       |                             |
                  | 24    | 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.

                           +-------+-----------+
                           | 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.




















Baset, et al.             Expires May 22, 2008                 [Page 86]


Internet-Draft            Peer-to-Peer Protocol            November 2007


                         +-------+---------------+
                         | PType | P2P-Algorithm |
                         +-------+---------------+
                         | 0     | Chord         |
                         |       |               |
                         | 1     | CAN           |
                         |       |               |
                         | 2     | Kademlia      |
                         |       |               |
                         | 3     | Pastry        |
                         |       |               |
                         | 4     | Bamboo        |
                         |       |               |
                         | 5     | Tapestry      |
                         |       |               |
                         | 6     | Accordion     |
                         |       |               |
                         | 7     | SkipNet       |
                         |       |               |
                         | 8     | Mercury       |
                         |       |               |
                         | 9     | Gia           |
                         +-------+---------------+

   Cont-Type:  This is a one-byte field in the Resource-Info object
      which defines the content-type of the object.  The following types
      are currently defined.

                       +-----------+---------------+
                       | Cont-Type | Description   |
                       +-----------+---------------+
                       | 0         | User-Info     |
                       |           |               |
                       | 1         | STUN          |
                       |           |               |
                       | 2         | TURN          |
                       |           |               |
                       | 3         | STUN+TURN+ICE |
                       +-----------+---------------+

   Component-ID:  The component ID as defined by ICE.










Baset, et al.             Expires May 22, 2008                 [Page 87]


Internet-Draft            Peer-to-Peer Protocol            November 2007


                      +--------------+-------------+
                      | Component-ID | Description |
                      +--------------+-------------+
                      | 0            | RTP         |
                      |              |             |
                      | 1            | RTCP        |
                      |              |             |
                      | 2            | SIP         |
                      |              |             |
                      | 2            | P2PP        |
                      +--------------+-------------+








































Baset, et al.             Expires May 22, 2008                 [Page 88]


Internet-Draft            Peer-to-Peer Protocol            November 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., Mahy, R., Matthews, P., and D. Wing, "Simple
         Traversal Underneath Network Address Translators (NAT) (STUN)",
          draft-ietf-behave-rfc3489bis-13 (work in progress),
         November 2007.

   [6]   Rosenberg, J., Mahy, R., and C. Huitema, "Obtaining Relay
         Addresses from Simple Traversal Underneath NAT (STUN)",
          draft-ietf-behave-turn-05 (work in progress), November 2007.

   [7]   Rosenberg, J., "Interactive Connectivity Establishment (ICE): A
         Methodology for Network  Address Translator (NAT) Traversal for
         Offer/Answer Protocols",  draft-ietf-mmusic-ice-19 (work in
         progress), October 2007.

14.2.  Informative References

   [8]   Willis, D., Bryan, D., Matthews, P., and E. Shim, "Concepts and
         Terminology for Peer-to-Peer SIP",
         draft-ietf-p2psip-concepts-01 (work in progress),
         November 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,



Baset, et al.             Expires May 22, 2008                 [Page 89]


Internet-Draft            Peer-to-Peer Protocol            November 2007


         pp. 73-84, 2005.

   [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



Baset, et al.             Expires May 22, 2008                 [Page 90]


Internet-Draft            Peer-to-Peer Protocol            November 2007


         computer communications. New York, NY, USA, pp. 407-418, 2003.

   [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.

   [22]  Rhea, S., Geels, D., Roscoe, T., and J. Kubiatowicz, "Handling
         Churn in a DHT", Proceedings of the 2004 USENIX Annual
         Technical Conference (USENIX '04) Boston, Massachusetts,
         June 2004.

   [23]  Docuer, J., "The Sybil Attack", IPTPS '02 , March 2002.

   [24]  MacDonald, D. and B. Lowekamp, "NAT Behavior Discovery Using
         STUN",  draft-ietf-behave-nat-behavior-discovery-01 (work in
         progress), June 2007.

   [25]  Srisuresh, P., Ford, B., and D. Kegel, "State of Peer-to-
         Peer(P2P) Communication Across Network Address
         Translators(NATs)",  draft-srisuresh-behave-p2p-state-04,
         September 2006.
























Baset, et al.             Expires May 22, 2008                 [Page 91]


Internet-Draft            Peer-to-Peer Protocol            November 2007


Appendix A.  Background


















































Baset, et al.             Expires May 22, 2008                 [Page 92]


Internet-Draft            Peer-to-Peer Protocol            November 2007


Appendix B.  Message Flow


















































Baset, et al.             Expires May 22, 2008                 [Page 93]


Internet-Draft            Peer-to-Peer Protocol            November 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


   Marcin Matuszewski
   Nokia
   Helsinki,
   Finland

   Email: marcin.matuszewski@nokia.com























Baset, et al.             Expires May 22, 2008                 [Page 94]


Internet-Draft            Peer-to-Peer Protocol            November 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, et al.             Expires May 22, 2008                 [Page 95]