RFC 5353

Endpoint Handlespace Redundancy Protocol (ENRP)

๐Ÿ“… published September 2008, from ietf

Endpoint Handlespace Redundancy Protocol (ENRP) ๐ŸŽ€

Okay bestie, the header is giving main character energy ๐Ÿ’… This is RFC 5353, published under the Network Working Group in September 2008. It's an Experimental doc, not a standard ๐Ÿงช. The authors are Q. Xie, R. Stewart (The Resource Group), M. Stillman (Nokia), M. Tuexen (Muenster Univ. of Applied Sciences), and A. Silverton (Sun Microsystems, Inc.) ๐Ÿ‘ฏโ€โ™€๏ธ. There are no "Obsoletes" or "Updates" lines in the header, so this one isn't replacing or changing anything else โœจ.

Status of This Memo ๐Ÿ“ฎ

This memo defines an Experimental Protocol for the Internet community, so think of it as a test drive ๐Ÿš—. It does not specify an Internet standard of any kind ๐Ÿ™ˆ. Discussion and suggestions for improvement are requested, so bestie, weigh in ๐Ÿ’ฌ. Distribution of this memo is unlimited ๐ŸŒˆ.

Abstract ๐Ÿฆ‹

ENRP, the Endpoint Handlespace Redundancy Protocol, is built to team up with the Aggregate Server Access Protocol (ASAP) so that the Reliable Server Pooling (RSerPool) requirements and architecture actually get done ๐Ÿ› ๏ธ. Inside RSerPool's operational scope, ENRP lays out the procedures and message formats for a distributed, fault-tolerant registry service. That service stores, keeps the books on, retrieves, and distributes pool operation and membership information ๐Ÿงš.

Table of Contents ๐Ÿ“‘

Here's the whole map, every section and subsection, so you can find your way around ๐Ÿ—บ๏ธ

   1. Introduction ....................................................3
      1.1. Definitions ................................................3
      1.2. Conventions ................................................4
   2. ENRP Message Definitions ........................................4
      2.1. ENRP_PRESENCE Message ......................................5
      2.2. ENRP_HANDLE_TABLE_REQUEST Message ..........................6
      2.3. ENRP_HANDLE_TABLE_RESPONSE Message .........................7
      2.4. ENRP_HANDLE_UPDATE Message .................................9
      2.5. ENRP_LIST_REQUEST Message .................................10
      2.6. ENRP_LIST_RESPONSE Message ................................11
      2.7. ENRP_INIT_TAKEOVER Message ................................12
      2.8. ENRP_INIT_TAKEOVER_ACK Message ............................13
      2.9. ENRP_TAKEOVER_SERVER Message ..............................14
      2.10. ENRP_ERROR Message .......................................15

   3. ENRP Operation Procedures ......................................15
      3.1. Methods for Communicating amongst ENRP Servers ............16
      3.2. ENRP Server Initialization ................................16
           3.2.1. Generate a Server Identifier .......................16
           3.2.2. Acquire Peer Server List ...........................17
                  3.2.2.1. Finding the Mentor Server .................17
                  3.2.2.2. Request Complete Server List from
                           Mentor Peer ...............................17
           3.2.3. Download ENRP Handlespace Data from Mentor Peer ....18
      3.3. Server Handlespace Update .................................20
           3.3.1. Announcing Additions or Updates of PE ..............20
           3.3.2. Announcing Removal of PE ...........................21
      3.4. Maintaining Peer List and Monitoring Peer Status ..........22
           3.4.1. Discovering New Peer ...............................22
           3.4.2. Server Sending Heartbeat ...........................22
           3.4.3. Detecting Peer Server Failure ......................23
      3.5. Taking Over a Failed Peer Server ..........................23
           3.5.1. Initiating Server Take-over Arbitration ............23
           3.5.2. Takeover Target Peer Server ........................24
      3.6. Handlespace Data Auditing and Re-synchronization ..........25
           3.6.1. Auditing Procedures ................................25
           3.6.2. PE Checksum Calculation Algorithm ..................26
           3.6.3. Re-Synchronization Procedures ......................27
      3.7. Handling Unrecognized Messages or Unrecognized
           Parameters ................................................28
   4. Variables and Thresholds .......................................28
      4.1. Variables .................................................28
      4.2. Thresholds ................................................28
   5. IANA Considerations ............................................28
      5.1. A New Table for ENRP Message Types ........................29
      5.2. A New Table for Update Action Types .......................29
      5.3. Port Numbers ..............................................30
      5.4. SCTP Payload Protocol Identifier ..........................30
   6. Security Considerations ........................................30
      6.1. Summary of RSerPool Security Threats ......................30
      6.2. Implementing Security Mechanisms ..........................32
      6.3. Chain of Trust ............................................34
   7. Acknowledgments ................................................35
   8. References .....................................................36
      8.1. Normative References ......................................36
      8.2. Informative References ....................................37

1. Introduction โœจ

ENRP is basically ASAP's sidekick ๐Ÿ’œ It's designed to work in conjunction with ASAP [RFC5352] so that RSerPool does everything its requirements [RFC3237] ask for. Together they make a whole squad ๐Ÿซถ.

Inside RSerPool's operational scope, ENRP sets the procedures and message formats for a distributed, fault-tolerant registry service. Its job is storing, bookkeeping, retrieving, and distributing pool operation and membership information ๐Ÿ“š. Iconic work, honestly ๐Ÿ‘‘.

Later in this document, we'll call that registry service the ENRP handlespace, or just handlespace, because it manages all the pool handles ๐Ÿ“.

1.1. Definitions ๐Ÿ“–

This document uses the following terms, so let's get the vocab down first ๐Ÿ’…

  • Operational scope: The part of the network that pool users can see for a specific instance of the reliable server pooling protocols ๐Ÿ‘€.
  • Pool (or server pool): A group of servers all providing the same application functionality ๐ŸŠ.
  • Pool handle: A logical pointer to a pool. Every server pool can be identified within the system's operational scope by its own unique pool handle ๐Ÿ”–.
  • Pool element: A server entity that has registered to a pool ๐Ÿ“.
  • Pool user: A user of a server pool ๐Ÿ™‹.
  • Pool element handle (or endpoint handle): A logical pointer to one particular pool element in a pool. It's made up of the pool handle plus the pool element's destination transport address ๐Ÿ“.
  • Handle space: A tight-knit structure of pool handles and their relations, which an internal or external agent can query ๐Ÿ•ธ๏ธ.
  • ENRP client channel: The communication channel an ASAP User (either a Pool Element (PE) or a Pool User (PU)) uses to request ENRP handlespace service. It's usually defined by the transport address of the Home ENRP server plus a well-known port number ๐Ÿ“ž.
  • ENRP server channel: Defined by a list of IP addresses (one for each ENRP server in an operational scope) plus a well-known port number ๐Ÿ›ฐ๏ธ. All ENRP servers in an operational scope can send "group-cast" messages to other servers through this channel. In a "group-cast", the sending server sends multiple copies of the message, one to each of its peer servers, over a set of point-to-point Stream Control Transmission Protocol (SCTP) associations between the sender and the peers ๐Ÿ’Œ. The "group-cast" may be conveniently implemented with the use of the SCTP_SENDALL option on a one-to-many style SCTP socket โšก.
  • Home ENRP server: The ENRP server that a PE or PU currently belongs to ๐Ÿ . A PE MUST only have one Home ENRP server at any given time, and both the PE and its Home ENRP server MUST keep track of this master/slave relationship between them. A PU SHOULD select one of the available ENRP servers as its Home ENRP server ๐Ÿซก.

1.2. Conventions ๐Ÿ“

Here's the key words check ๐Ÿ”‘. When you see the key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document, they're to be interpreted as described in [RFC2119] ๐Ÿง .

2. ENRP Message Definitions ๐Ÿ’Œ

In this section, we define the format of all ENRP messages ๐Ÿ“. These are the messages ENRP servers send and receive among themselves in an operational scope. Messages sent and received between a PE/PU and an ENRP server are part of ASAP and are defined in [RFC5352]. A common format, defined in [RFC5354], is used for all ENRP and ASAP messages ๐ŸŽ€.

Most ENRP messages mix fixed fields with TLV (Type-Length-Value) parameters ๐Ÿงฉ. The TLV parameters are also defined in [RFC5354]. If a nested TLV parameter doesn't end on a 32-bit word boundary, it gets padded with all '0' octets up to the next 32-bit word boundary ๐Ÿชก.

All messages, as well as their fields and parameters described below, MUST be transmitted in network byte order (aka Big Endian, meaning the most significant byte is transmitted first) ๐Ÿ”ข. That part is non-negotiable, bestie ๐Ÿ™…โ€โ™€๏ธ.

For ENRP, the following message types are defined in this section ๐Ÿ“‹:

         Type       Message Name
         -----      -------------------------
         0x00      - (Reserved by IETF)
         0x01      - ENRP_PRESENCE
         0x02      - ENRP_HANDLE_TABLE_REQUEST
         0x03      - ENRP_HANDLE_TABLE_RESPONSE
         0x04      - ENRP_HANDLE_UPDATE
         0x05      - ENRP_LIST_REQUEST
         0x06      - ENRP_LIST_RESPONSE
         0x07      - ENRP_INIT_TAKEOVER
         0x08      - ENRP_INIT_TAKEOVER_ACK
         0x09      - ENRP_TAKEOVER_SERVER
         0x0a      - ENRP_ERROR
         0x0b-0xff - (Reserved by IETF)

                                 Figure 1

2.1. ENRP_PRESENCE Message โœจ

okay so this ENRP message is the one that keeps announcing (periodically) that an ENRP server is alive ๐Ÿ’–, or pokes a peer ENRP server to check on its status ๐Ÿฆ‹. It goes out on the ENRP server channel or gets sent point-to-point to another ENRP server. main character energy ๐Ÿ’…

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Type = 0x01 |0|0|0|0|0|0|0|0|        Message Length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Sending Server's ID                       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    Receiving Server's ID                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                      PE Checksum Param                        :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :               Server Information Param (optional)             :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: 32 bits (unsigned integer) ๐Ÿงš

This is the ID of the ENRP server that sent this message.

Receiving Server's ID: 32 bits (unsigned integer) ๐ŸŒธ

This is the ID of the ENRP server to which this message is intended. If the message is not intended for an individual server (e.g., the message is group-casted to a group of servers), this field MUST be sent with all 0s. If the message is sent point-to-point, this field MAY be sent with all 0s.

PE Checksum Parameter: ๐Ÿ’œ

This is a TLV that contains the latest PE checksum of the ENRP server that sends the ENRP_PRESENCE. This parameter SHOULD be included for handlespace consistency auditing. See Section 3.6.1 for details.

Server Information Parameter: ๐ŸŽ€

If this parameter is present, it contains the server information of the sender of this message (the Server Information Parameter is defined in [RFC5354]). This parameter is optional. However, if this message is sent in response to a received "reply required" ENRP_PRESENCE from a peer, the sender then MUST include its server information.

Note, at startup, an ENRP server MUST pick a randomly generated, non-zero 32-bit unsigned integer as its ID and MUST use this same ID until the ENRP server is rebooted. ๐Ÿ”ฅ

2.2. ENRP_HANDLE_TABLE_REQUEST Message ๐ŸŒˆ

so an ENRP server sends this one to one of its peers when it wants a copy of the handlespace data ๐Ÿซถ. It's mostly used during server initialization or when the handlespace needs re-synchronizing ๐Ÿ”„.

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Type = 0x02 |0|0|0|0|0|0|0|W|    Message Length = 0xC       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Sending Server's ID                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Receiving Server's ID                     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

W (oWn-children-only) Flag: 1 bit ๐Ÿฆ‹

Set to '1' if the sender of this message is only requesting information about the PEs owned by the message receiver. Otherwise, set to '0'.

Sending Server's ID: ๐Ÿงš

See Section 2.1.

Receiving Server's ID: ๐ŸŒธ

See Section 2.1.


2.3. ENRP_HANDLE_TABLE_RESPONSE Message ๐Ÿ’…

the PEER_NAME_TABLE_RESPONSE message is what an ENRP server sends back after getting a PEER_NAME_TABLE_REQUEST, to help a peer get set up or sync its handlespace ๐ŸŽ€.

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Type = 0x03 |0|0|0|0|0|0|M|R|        Message Length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Sending Server's ID                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Receiving Server's ID                     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                                                               :
      :                     Pool Entry #1 (optional)                  :
      :                                                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                                                               :
      :                              ...                              :
      :                                                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                                                               :
      :                     Pool Entry #n (optional)                  :
      :                                                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

M (More_to_send) Flag: 1 bit ๐ŸŒˆ

Set to '1' if the sender of this message has more pool entries to send in subsequent ENRP_HANDLE_TABLE_RESPONSE messages. Otherwise, set to '0'.

R (Reject) Flag: 1 bit โญ

R (Reject) Flag: 1 bit is the "I'm not taking requests rn" flag ๐Ÿ’€. It MUST be set to '1' if the sender of this message is rejecting a handlespace request. In this case, pool entries MUST NOT be included. This might happen if the sender of this message is in the middle of initializing its database or is under high load.

Message Length: 16 bits (unsigned integer) ๐Ÿ“

Indicates the entire length of the message, including the header, in number of octets.

Note, the value in the Message Length field will not cover any padding at the end of this message.

Sending Server's ID: ๐Ÿงš

See Section 2.1.

Receiving Server's ID: ๐ŸŒธ

See Section 2.1.

Pool Entry #1-#n: ๐Ÿ‘‘

If the R flag is set to '0', at least one pool entry SHOULD be present in this message. Each pool entry MUST start with a Pool Handle parameter, as defined in Section 3.9 of [RFC5354], and is followed by one or more Pool Element parameters in TLV format, as shown below:

          +---------------------------+
          :      Pool Handle          :
          +---------------------------+
          :         PE #1             :
          +---------------------------+
          :         PE #2             :
          +---------------------------+
          :          ...              :
          +---------------------------+
          :         PE #n             :
          +---------------------------+

2.4. ENRP_HANDLE_UPDATE Message ๐Ÿฆ‹

the PEER_NAME_UPDATE message is sent by the Home ENRP server of a PE to all its peer servers to announce a registration, re-registration, or de-registration of that PE in the handlespace ๐Ÿ“ฃ.

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Type = 0x04 |0|0|0|0|0|0|0|0|        Message Length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Sending Server's ID                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Receiving Server's ID                     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Update Action          |        (reserved)             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                     Pool Handle Parameter                     :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :                    Pool Element Parameter                     :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Message Length: 16 bits (unsigned integer) ๐Ÿ“

Indicates the entire length of the message, including the header, in number of octets.

Note, the value in the Message Length field will not cover any padding at the end of this message.

Update Action: 16 bits (unsigned integer) ๐Ÿ”ฅ

This field indicates the requested action of the specified PE. The field MUST be set to one of the following values:

  • 0x0000 - ADD_PE: Add or update the specified PE in the ENRP handlespace.
  • 0x0001 - DEL_PE: Delete the specified PE from the ENRP handlespace.
  • 0x0002 - 0xFFFF: Reserved by IETF.

Other values are reserved by IETF and MUST NOT be used.

Reserved: 16 bits ๐ŸŒ™

This field MUST be set to all 0s by the sender and ignored by the receiver.

Sending Server's ID: ๐Ÿงš

See Section 2.1.

Receiving Server's ID: ๐ŸŒธ

See Section 2.1.

Pool Handle: ๐Ÿ’–

Specifies to which the PE belongs.

Pool Element: ๐Ÿ’œ

Specifies the PE.


2.5. ENRP_LIST_REQUEST Message ๐ŸŒธ

the PEER_LIST_REQUEST message is sent to ask for a current copy of the ENRP server list ๐Ÿ“‹. It's usually sent from a newly activated ENRP server to an established one as part of initialization ๐ŸŒฑ.

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Type = 0x05 |0|0|0|0|0|0|0|0|    Message Length = 0xC       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Sending Server's ID                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Receiving Server's ID                     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: ๐Ÿงš

See Section 2.1.

Receiving Server's ID: ๐ŸŒธ

See Section 2.1.

2.6. ENRP_LIST_RESPONSE Message ๐Ÿงš

okay so the PEER_LIST_RESPONSE message is what an ENRP server sends back when it gets a PEER_LIST_REQUEST. It's basically the server spilling the tea on all the other ENRP servers it knows about ๐Ÿ’…

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x06 |0|0|0|0|0|0|0|R|        Message Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sending Server's ID                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Receiving Server's ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:            Server Information Parameter of Peer #1            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           ...                                 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:            Server Information Parameter of Peer #n            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

R (Reject) Flag: 1 bit ๐Ÿ™ˆ

Bestie, this one's a bouncer. The R flag MUST be set to '1' if the sender is rejecting a PEER_LIST_REQUEST message. When that happens, the message MUST NOT include any Server Information Parameters. No guest list, no vibes ๐Ÿšซ

Message Length: 16 bits (unsigned integer) ๐Ÿ“

This tells you the whole length of the message in octets. Quick heads up: the Message Length value does NOT count any padding at the very end of the message, so don't add that in ๐Ÿ‘€

Sending Server's ID: see Section 2.1 ๐Ÿซถ

Receiving Server's ID: see Section 2.1 ๐Ÿซถ

Server Information Parameter of Peer #1-#n: each one holds a Server Information Parameter for a peer the sender knows about. That parameter is defined in [RFC5354] ๐Ÿฆ‹


2.7. ENRP_INIT_TAKEOVER Message ๐Ÿ‘‘

the ENRP_INIT_TAKEOVER message is when an ENRP server (the takeover initiator) announces it's about to take over a specific peer ENRP server. It gets sent to every single one of its peers. Main character energy, literally ๐Ÿ”ฅ

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x07 |0|0|0|0|0|0|0|0|        Message Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sending Server's ID                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Receiving Server's ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Targeting Server's ID                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: see Section 2.1 ๐Ÿซถ

Receiving Server's ID: see Section 2.1 ๐Ÿซถ

Targeting Server's ID: 32 bits (unsigned integer) ๐ŸŽฏ

This is the ID of the peer ENRP that's the target of this takeover attempt. Someone's getting taken over, and this is how you name them ๐Ÿ˜ญ


2.8. ENRP_INIT_TAKEOVER_ACK Message ๐ŸŒธ

the PEER_INIT_TAKEOVER_ACK message gets sent back to the takeover initiator. It's the "yeah, I see you, and I don't object" reply. A total green-light, no drama ๐Ÿ’–

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x08 |0|0|0|0|0|0|0|0|        Message Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sending Server's ID                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Receiving Server's ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Targeting Server's ID                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: see Section 2.1 ๐Ÿซถ

Receiving Server's ID: see Section 2.1 ๐Ÿซถ

Targeting Server's ID: this is the ID of the peer ENRP that's the target of this takeover attempt ๐Ÿงš


2.9. ENRP_TAKEOVER_SERVER Message ๐Ÿ“ฃ

the PEER_TAKEOVER_REGISTRAR message is sent by the takeover initiator to officially declare that a takeover is happening, and it goes out to all the active peer ENRP servers. It's basically the group announcement ๐ŸŽ€

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x09 |0|0|0|0|0|0|0|0|        Message Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sending Server's ID                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Receiving Server's ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Targeting Server's ID                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: see Section 2.1 ๐Ÿซถ

Receiving Server's ID: see Section 2.1 ๐Ÿซถ

Targeting Server's ID: this is the ID of the peer ENRP that's the target of this takeover operation ๐ŸŽฏ


2.10. ENRP_ERROR Message ๐Ÿšจ

the ENRP_ERROR message is how a registrar reports an operational error to a peer ENRP server. Not the vibe, but it's good to know about ๐Ÿ’€

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0x0a |0|0|0|0|0|0|0|0|        Message Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sending Server's ID                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Receiving Server's ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                 Operational Error Parameter                   :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Sending Server's ID: see Section 2.1 ๐Ÿซถ

Receiving Server's ID: see Section 2.1 ๐Ÿซถ

Operational Error Parameter: this parameter, defined in [RFC5354], tells you what type of error (or errors) is being reported ๐Ÿฆ‹


3. ENRP Operation Procedures ๐ŸŒˆ

okay, this is where the procedures live. In this section we go over the operation procedures ENRP defines, and an ENRP server MUST follow them when it's sending, receiving, or processing ENRP messages. Rules are rules, bestie ๐Ÿ‘‘

A lot of RSerPool events need both server-to-server AND PU/PE-to-server message exchanges. But only the exchanges and activities between an ENRP server and its peers count as ENRP scope, and that's what this document defines. The PE/PU and ENRP server stuff lives in [RFC5352] ๐Ÿ“–

3.1. Methods for Communicating amongst ENRP Servers ๐Ÿ’ฌ

inside an RSerPool operational scope, ENRP servers have to talk to each other to swap info, like pool membership changes, handlespace data synchronization, and so on ๐Ÿ“

there are two kinds of communication happening between ENRP servers:

  • point-to-point message exchanges from one ENPR server to a specific peer server, and
  • announcements from one server to all its peer servers in the operational scope.

point-to-point communication always happens over an SCTP association between the sending server and the receiving server. Announcements go out as "group-casts" over the ENRP server channel. Group chat, but make it networking ๐Ÿ“ฃ

3.2. ENRP Server Initialization ๐Ÿฃ

this section covers the steps a new ENRP server needs to take to join the other existing ENRP servers. Or, if it's the first ENRP server started in the operational scope, it covers how to kick off the handlespace service ๐Ÿš€

3.2.1. Generate a Server Identifier ๐Ÿ†”

a new ENRP server MUST generate a non-zero, 32-bit server ID that's as unique as possible among all the ENRP servers in the operational scope. And that server ID MUST remain unchanged for the entire lifetime of the server. Its identity, its forever โœจ Usually a good 32-bit random number does the trick. The server ID [RFC4086] gives some info on randomness guidelines if you want to dig in ๐Ÿง 

Okay, real talk: there's a very remote chance (about 1 in about 4 billion) that two ENRP servers in an operational scope end up with the same server ID, which causes an ID conflict in the pool. Still, no severe consequence of that conflict has been identified. Low-key a relief ๐Ÿ™

also, the ENRP server ID space is separate from the PE Id space defined in [RFC5352]. Different lanes, no crossing ๐Ÿ›ฃ๏ธ

3.2.2. Acquire Peer Server List ๐Ÿ—‚๏ธ

at startup, the ENRP server (the initiating server) first tries to learn about all the existing peer ENRP servers in the same operational scope. Or it figures out that it's totally alone in the scope. Either way, it's getting the full picture ๐Ÿ–ผ๏ธ

the initiating server uses an existing peer server to bootstrap itself into service. That peer is called the mentor server ๐Ÿง‘โ€๐Ÿซ

3.2.2.1. Finding the Mentor Server ๐Ÿ”

if the initiating server is told about one existing peer server through some administrative means (like a DNS query, a configuration database, startup scripts, etc.), the initiating server MUST then use that peer server as its mentor server. Easy, one choice, no decision fatigue ๐Ÿ’…

if multiple existing peer servers are specified, the initiating server MUST pick one of them as its mentor server and keep the others as its backup mentor servers. Think of it as a main pick with backups on standby ๐Ÿซถ

if no existing peer server is specified, the initiating server MUST assume that it's alone in the operational scope. It MUST skip the procedures in Section 3.2.2.2 and Section 3.2.3, and it MUST consider its initialization completed and start offering ENRP services. Solo era, and it's still iconic โœจ

3.2.2.2. Request Complete Server List from Mentor Peer ๐ŸŽ€

okay so once the initiating server finds its mentor peer (whether through discovery or admin setup), it MUST send an ENRP_LIST_REQUEST message to that mentor to ask for a copy of the complete server list the mentor keeps. (see Section 3.4 for how that list gets maintained ๐Ÿ’…)

The initiating server SHOULD start a MAX-TIME-NO-RESPONSE timer every time it finishes sending an ENRP_LIST_REQUEST message. If the timer expires before it hears back from the mentor peer, the initiating server SHOULD abandon that mentor and send a new server list request to a backup mentor peer, if one is available. โฐ

Once the mentor gets this request, it SHOULD reply with an ENRP_LIST_RESPONSE message and include every existing ENRP server it knows about in the message body. ๐Ÿงš

When the initiating server gets that ENRP_LIST_RESPONSE from the mentor peer, it MUST use the server information in it to set up its own peer list. โœจ

ngl this next part is the one where the mentor might be too busy to help. ๐Ÿ™ˆ

If the mentor is still starting up and isn't ready to hand out a peer list (for example, it's waiting on a reply to its own ENRP_LIST_REQUEST to another server), it MUST reject the request and send back an ENRP_LIST_RESPONSE with the R flag set to '1' and no server information in the response. ๐Ÿ˜ญ

If its ENRP_LIST_REQUEST gets rejected, the initiating server SHOULD either wait a few seconds and re-send the ENRP_LIST_REQUEST to the same mentor, or, if a backup mentor peer is available, pick another mentor and send the ENRP_LIST_REQUEST there instead. ๐Ÿฆ‹

3.2.3. Download ENRP Handlespace Data from Mentor Peer ๐ŸŒธ

after the peer list download is done, the initiating server MUST ask its mentor peer for a copy of the current handlespace data. here's how it goes:

  1. The initiating server MUST first send an ENRP_HANDLE_TABLE_REQUEST message to the mentor peer, with the W flag set to '0', which means it's asking for the entire handlespace. ๐Ÿ“
  2. When the mentor gets this message, it MUST start a download session. It sends a copy of its current handlespace data to the initiating server in one or more ENRP_HANDLE_TABLE_RESPONSE messages. (Note, the mentor might find it especially smart to split things up into multiple ENRP_HANDLE_TABLE_RESPONSE messages when the handlespace is huge, since forming and sending one giant response could interrupt its other services. ๐Ÿง )

If the download uses more than one ENRP_HANDLE_TABLE_RESPONSE message, the mentor MUST use the M flag in each one to show whether it's the last message for that download session. More specifically, the mentor MUST set the M flag to '1' in the outgoing ENRP_HANDLE_TABLE_RESPONSE if there's still more data to send, and it MUST keep track of how far along the current download session is. For the final ENRP_HANDLE_TABLE_RESPONSE of the session, the mentor MUST set the M flag to '0' and close the download session (meaning it removes any internal record of the session) right after sending that last message. ๐Ÿ’Œ

  1. During the download, every time the initiating server gets an ENRP_HANDLE_TABLE_RESPONSE, it MUST move the data entries from that message into its local handlespace database, and then check whether this message is the last one in the session.

If the M flag is set to '1' in the ENRP_HANDLE_TABLE_RESPONSE it just processed, the initiating server MUST send another ENRP_HANDLE_TABLE_REQUEST to the mentor peer to ask for the next ENRP_HANDLE_TABLE_RESPONSE. ๐Ÿ”

  1. When the initiating server unpacks the data entries from an ENRP_HANDLE_TABLE_RESPONSE into its local handlespace database, it MUST handle each pool entry using these rules:
    • A. If the pool doesn't exist in the local handlespace, the initiating server MUST create the pool locally and add the PE(s) in the pool entry to it. When it creates the pool, the initiation server MUST set the overall member selection policy type of the pool to the policy type indicated in the first PE. ๐ŸŒˆ
    • B. If the pool already exists locally, but the PE(s) in the pool entry aren't currently members of it, the initiating server MUST add the PE(s) to the pool. ๐Ÿซถ
    • C. If the pool already exists locally AND the PE(s) in the pool entry are already members of it, the initiating server SHOULD replace the attributes of the existing PE(s) with the new information. ENRP will make sure that the information stays up to date. ๐Ÿ”ฅ
  2. When the last ENRP_HANDLE_TABLE_RESPONSE is received from the mentor peer and unpacked into the local handlespace, the initialization process is complete, and the initiating server SHOULD start providing ENRP services. ๐Ÿ‘‘

Sometimes the mentor itself can't provide a handlespace download. For example, it might be in the middle of initializing its own handlespace database, or it might already have too many download sessions open with other servers. ๐Ÿ™ˆ

In that case, the mentor MUST reject the request and respond with an ENRP_HANDLE_TABLE_RESPONSE with the R flag set to '1' and no pool entries included. ๐Ÿ’€

If its ENRP_HANDLE_TABLE_REQUEST gets rejected by the mentor peer, the initiating server SHOULD either wait a few seconds and re-send the ENRP_HANDLE_TABLE_REQUEST to the mentor server, or, if a backup mentor peer is available, pick another mentor peer server and send the ENRP_HANDLE_TABLE_REQUEST to the new mentor server. ๐Ÿงš

A handlespace download session that has already started can get interrupted for some reason. To handle that, the initiating server SHOULD start a timer every time it finishes sending an ENRP_HANDLE_TABLE_REQUEST to its mentor peer. If the timer expires without a response from the mentor peer, the initiating server SHOULD abort the current download session and restart a new handlespace download with a backup mentor peer, if one is available. โณ

It works the other way too. After the mentor sends an ENRP_HANDLE_TABLE_RESPONSE and sets the M-bit to '1' (meaning it still has more data to send), it SHOULD start a session timer. If that timer expires without another request from the initiating server, the mentor SHOULD abort the session and clean out any resources and records of it. ๐Ÿงน

3.3. Server Handlespace Update ๐Ÿ’–

this is the group of update operations an ENRP server uses to tell its peers when its local handlespace changes. think: a new PE shows up, an existing PE leaves, or a pool's or PE's properties get changed. ๐Ÿฆ‹

3.3.1. Announcing Additions or Updates of PE โœจ

when a new PE gets registered to the handlespace, or an existing PE gets re-registered, the Home ENRP server uses this procedure to tell all its peers. ๐ŸŽ€

This is an ENRP announcement, and it gets sent to all the peers of the Home ENRP server. See Section 3.1 on how announcements are sent.

An ENRP server MUST announce this update to all its peers in an ENRP_HANDLE_UPDATE message with the Update Action field set to ADD_PE, which means a new PE was added or an existing PE was modified. The complete new information for the PE and the pool it belongs to MUST be included in the message, in a PE parameter and a Pool Handle parameter, respectively. ๐Ÿ’…

The Home ENRP server SHOULD fill in its server ID in the Sending Server's ID field and leave the Receiving Server's ID blank (that is, all 0s). ๐Ÿซถ

When a peer receives this ENRP_HANDLE_UPDATE message, it MUST take these actions:

  1. If the named pool indicated by the pool handle doesn't exist in its local copy of the handlespace, the peer MUST create the named pool in its local handlespace and add the PE to the pool as the first PE. It MUST then copy in all of the other attributes of the PE carried in the message.

When the new pool is created, the overall member selection policy of the pool MUST be set to the policy type indicated by the PE. ๐ŸŒธ

  1. If the named pool already exists in the peer's local copy of the handlespace and the PE doesn't exist, the peer MUST add the PE to the pool as a new PE and copy in all attributes of the PE carried in the message. ๐Ÿ“
  2. If the named pool exists and the PE is already a member of the pool, the peer MUST replace the attributes of the PE with the new information carried in the message. ๐Ÿ”

3.3.2. Announcing Removal of PE ๐Ÿฅ€

When an existing PE gets de-registered, or gets removed from its handlespace for some other reason (for example, purging an unreachable PE, see Section 3.5 in [RFC5352]), the ENRP server MUST use this procedure to tell all its peers about the change. ๐Ÿ’”

This is an ENRP announcement, and it gets sent to all the peers of the Home ENRP server. See Section 3.1 on how announcements are sent.

An ENRP server MUST announce the PE removal to all its peers in an ENRP_HANDLE_UPDATE message with the Update Action field set to DEL_PE, which means an existing PE is being removed. The complete information of the PE and the pool it belongs to MUST be included in the message, in a PE parameter and a Pool Handle parameter, respectively. ๐Ÿ™…โ€โ™€๏ธ

The sending server MUST fill in its server ID in the Sending Server's ID field and leave the Receiving Server's ID blank (that is, set to all 0s). ๐Ÿงš

When a peer receives this ENRP_HANDLE_UPDATE message, it MUST first find the pool and the PE in its own handlespace, and then remove the PE from its local handlespace. If the removed PE was the last one in the pool, the peer MUST also delete the pool from its local handlespace. ๐Ÿ—‘๏ธ

If the peer can't find the PE or the pool in its handlespace, it SHOULD take no further action. ๐Ÿคทโ€โ™€๏ธ

3.4. Maintaining Peer List and Monitoring Peer Status ๐Ÿ‘€

An ENRP server MUST keep an internal record of the status of each of its known peers. This record is called the server's "peer list." ๐Ÿ“‹

3.4.1. Discovering New Peer ๐Ÿ”

If a message of any type comes in from a peer the server hasn't seen before, the ENRP server MUST treat that peer as a new peer in the operational scope and add it to the peer list. ๐ŸŒŸ

The ENRP server MUST send an ENRP_PRESENCE message with the Reply-required flag set to '1' to the source address in the arriving message. This forces the new peer to reply with its own ENRP_PRESENCE containing its full server information (see Section 2.1). ๐Ÿซถ

3.4.2. Server Sending Heartbeat ๐Ÿ’–

Okay so every PEER-HEARTBEAT-CYCLE seconds, an ENRP server MUST announce its continued presence to all its peers with an ENRP_PRESENCE message ๐Ÿซถ. In that message, the ENRP server MUST set the 'Replay_required' flag to '0', which just means "no reply needed" ๐Ÿฆ‹.

The arrival of this periodic ENRP_PRESENCE message makes every peer update its internal variable peer_last_heard for the sender (see Section 3.4.3 for more details) โœจ.

3.4.3. Detecting Peer Server Failure ๐ŸŒธ

An ENRP server MUST keep an internal variable peer_last_heard for each of its known peers, and this variable MUST be updated to the current local time every time a message of any type (point-to-point or announcement) comes in from that peer ๐Ÿ’œ.

If a peer hasn't been heard from for more than MAX-TIME-LAST-HEARD seconds, the ENRP server MUST immediately send a point-to-point ENRP_PRESENCE with the Reply_request flag set to '1' to that peer ๐Ÿ‘€.

If the send fails or the peer doesn't reply after MAX-TIME-NO-RESPONSE seconds, the ENRP server MUST consider the peer server dead ๐Ÿ’€ and SHOULD initiate the takeover procedure defined in Section 3.5.

3.5. Taking Over a Failed Peer Server ๐Ÿฆธโ€โ™€๏ธ

In the following descriptions, we call the ENRP server that detects the failed peer server and starts the takeover the "initiating server", and the failed peer server the "target server". This is what lets the PE keep working when its Home ENRP server goes down ๐Ÿซถ.

3.5.1. Initiating Server Take-over Arbitration ๐ŸฅŠ

The initiating server SHOULD first start the takeover arbitration by sending an ENRP_INIT_TAKEOVER message to all its peer servers. See Section 3.1 on how announcements are sent. In the message, the initiating server MUST fill in the Sending Server's ID and Targeting Server's ID. The goal is that only one ENRP server takes over the PE from the target ๐ŸŽฏ.

After announcing the ENRP_INIT_TAKEOVER message ("group-casting" to all known peers, including the target server), the initiating server SHOULD wait for an ENRP_INIT_TAKEOVER_ACK message from each of its known peers, except the target server ๐Ÿงš.

Each peer that receives an ENRP_INIT_TAKEOVER message from the initiating server MUST take the following actions:

  1. If the peer server determines that it (itself) is the target server named in the ENRP_INIT_TAKEOVER message, it MUST immediately announce an ENRP_PRESENCE message to all its peer ENRP servers to try to stop this takeover. This is a false failure detection by the initiating server ๐Ÿ™ˆ. The initiating server MUST stop the takeover by marking the target server as "active" and taking no further takeover actions.
  2. If the peer server finds that it has already started its own takeover arbitration on the same target server, it MUST perform the following arbitration:
    • A. If the peer's server ID is smaller in value than the Sending Server's ID in the arrived ENRP_INIT_TAKEOVER message, the peer server MUST immediately abort its own takeover attempt by taking no further takeover actions of its own. Moreover, the peer MUST mark the target server as "not active" on its internal peer list so that its status will no longer be monitored by the peer, and reply to the initiating server with an ENRP_INIT_TAKEOVER_ACK message ๐Ÿณ๏ธ.
    • B. Otherwise, the peer MUST ignore the ENRP_INIT_TAKEOVER message ๐Ÿ™…โ€โ™€๏ธ.
  3. If the peer finds that it is neither the target server nor already in its own takeover process, the peer MUST: a) mark the target server as "not active" on its internal peer list so that its status will no longer be monitored by this peer, and b) MUST reply to the initiating server with an ENRP_INIT_TAKEOVER_ACK message ๐Ÿซถ.

Once the initiating server has received the ENRP_INIT_TAKEOVER_ACK message from all of its currently known peers (except the target server), it MUST consider that it has won the arbitration and MUST proceed to complete the takeover, following the steps in Section 3.5.2 ๐Ÿ‘‘.

However, if it receives an ENRP_PRESENCE from the target server at any point during the arbitration, the initiating server MUST immediately stop the takeover process and mark the status of the target server as "active" ๐Ÿ˜ญ.

3.5.2. Takeover Target Peer Server ๐Ÿ‘‘

The initiating ENRP server MUST first send, via an announcement, an ENRP_TAKEOVER_SERVER message to tell all its active peers that the takeover has happened. The target server's ID MUST be filled in the message. The initiating server SHOULD then remove the target server from its internal peer list ๐Ÿงน.

After that, it SHOULD look through its local copy of the handlespace and claim ownership of each PE that was originally owned by the target server, by following these steps:

  1. mark itself as the Home ENRP server of each PE that was originally owned by the target server;
  2. send a point-to-point ASAP_ENDPOINT_KEEP_ALIVE message, with the 'H' flag set to '1', to each of the PEs. This triggers the PE to adopt the initiating server as its new Home ENRP server ๐Ÿฆ‹.

When a peer receives the ENRP_TAKEOVER_SERVER message from the initiating server, it SHOULD update its local peer list and PE cache by following these steps:

  1. remove the target server from its internal peer list;
  2. update the Home ENRP server of each PE in its local copy of the handlespace to be the sender of the message, i.e., the initiating server ๐Ÿ’….

3.6. Handlespace Data Auditing and Re-synchronization ๐Ÿงšโ€โ™€๏ธ

Message losses or certain temporary breaks in network connectivity can leave the local handlespace copies of some ENRP servers in an operational scope out of sync. So each ENRP server in the operational scope SHOULD periodically check that its local copy of the handlespace data still matches its peers' copies ๐Ÿ”.

This section defines the auditing and re-synchronization procedures that an ENRP server uses to keep its handlespace data consistent ๐ŸŒˆ.

3.6.1. Auditing Procedures ๐Ÿ”

A checksum covering the data that should be the same is exchanged, and that's how everyone figures out whether the data really matches ๐Ÿงฎ.

The auditing of handlespace consistency works like this:

  1. An ENRP server SHOULD keep a separate PE checksum (a 16-bit integer internal variable) for each of its known peers and for itself. For an ENRP server with 'k' known peers, we denote these internal variables as pe_checksum_pr0, pe_checksum_pr1, ..., pe_checksum_prk, where pe_checksum_pr0 is the server's own PE checksum. The list of what these checksums cover and a detailed algorithm for calculating them is given in Section 3.6.2.
  2. Each time an ENRP server sends out an ENRP_PRESENCE, it MUST include its current PE checksum (i.e., pe_checksum_pr0) in the message.
  3. When an ENRP server (server A) receives a PE checksum (carried in an arrived ENRP_PRESENCE) from a peer ENRP server (server B), server A SHOULD compare the PE checksum in the ENRP_PRESENCE with its own internal PE checksum for server B (i.e., pe_checksum_prB).
  4. If the two values match, server A considers that there's no handlespace inconsistency between itself and server B, and it should take no further action ๐Ÿ˜Œ.
  5. If the two values do NOT match, server A SHOULD consider that there is a handlespace inconsistency between itself and server B, and a re-synchronization process SHOULD be carried out immediately with server B (see Section 3.6.3) ๐Ÿšจ.

3.6.2. PE Checksum Calculation Algorithm ๐Ÿง

When an ENRP server (server A) calculates an internal PE checksum for a peer (server B), it MUST use the following algorithm ๐Ÿค“.

Let's say that in server A's internal handlespace, there are currently 'M' PEs owned by server B. Each of the 'M' PEs contributes to the checksum calculation with the following byte block:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   :  Pool handle string of the pool the PE belongs (padded with   :
   :  zeros to next 32-bit word boundary, if needed)               :
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        PE Id (4 octets)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Note, these are not TLVs. This byte block gives each PE a unique byte pattern in the scope. The 16-bit PE checksum for server B, pe_checksum_prB, is then calculated over the byte blocks contributed by the 'M' PEs one by one. The PE checksum calculation MUST use the Internet algorithm described in [RFC1071] ๐Ÿง .

Server A MUST calculate its own PE checksum (i.e., pe_checksum_pr0) in the same way, using the byte blocks of all the PEs it owns itself ๐Ÿ™Œ.

Note, whenever an ENRP finds that its internal handlespace has changed (e.g., due to PE registration or de-registration, receiving peer updates, removing failed PEs, downloading handlespace pieces from a peer, etc.), it MUST immediately update all its internal PE checksums that are affected by the change โšก.

Implementation Note: when the internal handlespace changes (e.g., a new PE is added or an existing PE is removed), an implementation need not re-calculate the affected PE checksum. It can instead just update the checksum by adding or subtracting the byte block of the corresponding PE from the previous checksum value ๐Ÿงฎ๐Ÿ’–

3.6.3. Re-Synchronization Procedures ๐Ÿ”„

If an ENRP server determines that its local handlespace data and a peer's handlespace data don't match for the PEs owned by that peer, it MUST perform the following steps to re-synchronize the data ๐Ÿซถ:

  1. The ENRP server SHOULD first "mark" every PE it knows about that is owned by the peer in its local handlespace database;
  2. The ENRP server SHOULD then send an ENRP_HANDLE_TABLE_REQUEST message with the W flag set to '1' to the peer, asking for a complete list of PEs owned by the peer ๐Ÿ“‹;
  3. When the peer receives the ENRP_HANDLE_TABLE_REQUEST message with the W flag set to '1', it SHOULD immediately respond with an ENRP_HANDLE_TABLE_RESPONSE message listing all PEs currently owned by the peer ๐Ÿ’Œ;
  4. When the ENRP server receives the ENRP_HANDLE_TABLE_RESPONSE message, it SHOULD transfer the PE entries carried in the message into its local handlespace database. If a PE entry being transferred already exists in its local database, the ENRP server MUST replace the entry with the copy found in the message and remove the "mark" from the entry ๐Ÿช„;
  5. After transferring all the PE entries from the received ENRP_HANDLE_TABLE_RESPONSE message into its local database, the ENRP server SHOULD check whether any PE entries are still "marked" in its local handlespace. If so, the ENRP server SHOULD silently remove those "marked" entries ๐Ÿงน.

Note, just like in Section 3.2.3, the peer may reject the ENRP_HANDLE_TABLE_REQUEST or use more than one ENRP_HANDLE_TABLE_RESPONSE message to respond ๐ŸŒˆ.

3.7. Handling Unrecognized Messages or Unrecognized Parameters ๐Ÿงš

okay so bestie, what happens when an ENRP server gets something it doesn't recognize? ๐Ÿ‘€ If it gets an ENRP message with a message type it's never heard of, or a known message type that has a parameter it doesn't know, it SHOULD handle that unknown message or parameter using the unrecognized message and parameter handling rules in Sections 3 and 4 of [RFC5354]. ๐Ÿ’…

And according to those rules, if the sender needs an error report, the ENRP server that spotted the problem SHOULD send back an ENRP_ERROR message with a proper error cause code. ๐Ÿšจ Lowkey the most organized way to tell someone "hey, you messed up" ๐Ÿซถ

4. Variables and Thresholds โœจ

4.1. Variables ๐ŸŒธ

  • peer_last_heard: the local time that a peer server was last heard, meaning the last time it got either a group-cast or point-to-point message from that peer. ๐Ÿฆ‹
  • pe_checksum_pr: the internal 16-bit PE checksum that an ENRP server keeps for a peer. Each known peer gets its own PE checksum, and the server keeps one for itself too. ๐Ÿ’œ

4.2. Thresholds ๐ŸŽ€

These are the timing numbers that keep everything running on schedule. โฐ

  • PEER-HEARTBEAT-CYCLE: how often an ENRP server announces a heartbeat message to all its known peers. (Default=30 secs.) ๐Ÿ’–
  • MAX-TIME-LAST-HEARD: the pre-set threshold for how long an ENRP server waits before it starts thinking a silent peer server might be dead. (Default=61 secs.) ๐Ÿ˜ญ
  • MAX-TIME-NO-RESPONSE: the pre-set threshold for how long a message sender waits for a response after sending a message. (Default=5 secs.) ๐Ÿ“

5. IANA Considerations ๐Ÿ“‹

This document (RFC 5353) is the reference for all the registrations described in this section. Every registration has been listed on the RSerPool Parameters page. ๐ŸŒˆ

5.1. A New Table for ENRP Message Types ๐Ÿ’Œ

ENRP Message Types are maintained by IANA, and IANA has assigned ten initial values, which you can see in Figure 1. IANA made a brand new table called "ENRP Message Types":

Type       Message Name                 Reference
-----      -------------------------    ---------
0x00       (Reserved by IETF)           RFC 5353
0x01       ENRP_PRESENCE                RFC 5353
0x02       ENRP_HANDLE_TABLE_REQUEST    RFC 5353
0x03       ENRP_HANDLE_TABLE_RESPONSE   RFC 5353
0x04       ENRP_HANDLE_UPDATE           RFC 5353
0x05       ENRP_LIST_REQUEST            RFC 5353
0x06       ENRP_LIST_RESPONSE           RFC 5353
0x07       ENRP_INIT_TAKEOVER           RFC 5353
0x08       ENRP_INIT_TAKEOVER_ACK       RFC 5353
0x09       ENRP_TAKEOVER_SERVER         RFC 5353
0x0a       ENRP_ERROR                   RFC 5353
0x0b-0xff  (Available for assignment)   RFC 5353

If you want to register an ENRP Message Type in this table, send the request to IANA. The number must be unique. The "Specification Required" policy of [RFC5226] MUST be applied. ๐Ÿ”’

5.2. A New Table for Update Action Types ๐Ÿ”

Update Types are maintained by IANA too, and IANA has assigned two initial values. IANA made another new table called "Update Action Types":

Type           Update Action              Reference
-------------  --------------------       ---------
0x0000         ADD_PE                      RFC 5353
0x0001         DEL_PE                      RFC 5353
0x0002-0xffff  (Available for assignment)  RFC 5353

Same deal here: requests to register an Update Action Type go to IANA, the number must be unique, and the "Specification Required" policy of [RFC5226] MUST be applied. โœจ

5.3. Port Numbers ๐Ÿ”Œ

The references for the port numbers that were already assigned have been updated to RFC 5353:

enrp-udp 9901/udp
enrp-sctp 9901/sctp
enrp-sctp-tls 9902/sctp

5.4. SCTP Payload Protocol Identifier ๐Ÿซง

The reference for the ENRP payload protocol identifier that was already assigned, which is 12, has been updated to RFC 5353. ๐Ÿ’…

6. Security Considerations ๐Ÿ”

Okay, this section is serious, so let's get into it. ๐Ÿ˜ค We're going to look at the threats to the RSerPool architecture and the security requirements that respond to them. Then we'll go over the security mechanisms that implementations REQUIRED to use, which are based on TLS. ๐Ÿ›ก๏ธ Last, we'll walk through a chain-of-trust argument that checks the critical data paths in RSerPool and shows how TLS protects them. It's giving full security audit energy. ๐Ÿ’€

6.1. Summary of RSerPool Security Threats ๐Ÿ•ต๏ธโ€โ™€๏ธ

"Threats Introduced by Reliable Server Pooling (RSerPool) and Requirements for Security in Response to Threats" [RFC5355] goes deep into the threats to the RSerPool architecture and lists the security requirements for each one. Here are the security services RSerPool needs, based on the threats in this document:

  • Threat 1) PE registration/de-registration flooding or spoofing Security mechanism in response: ENRP server authenticates the PE. ๐Ÿ”‘
  • Threat 2) PE registers with a malicious ENRP server Security mechanism in response: PE authenticates the ENRP server. ๐Ÿ”‘
  • Threats 1 and 2, taken together, result in mutual authentication of the ENRP server and the PE. ๐Ÿค
  • Threat 3) Malicious ENRP server joins the ENRP server pool Security mechanism in response: ENRP servers mutually authenticate. ๐Ÿค
  • Threat 4) A PU communicates with a malicious ENRP server for handle resolution Security mechanism in response: The PU authenticates the ENRP server. ๐Ÿ”‘
  • Threat 5) Replay attack Security mechanism in response: Security protocol that has protection from replay attacks. ๐Ÿ”
  • Threat 6) Corrupted data that causes a PU to have misinformation concerning a pool handle resolution Security mechanism in response: Security protocol that supports integrity protection. ๐Ÿงพ
  • Threat 7) Eavesdropper snooping on handlespace information Security mechanism in response: Security protocol that supports data confidentiality. ๐Ÿ™ˆ
  • Threat 8) Flood of ASAP_ENDPOINT_UNREACHABLE messages from the PU to ENRP server Security mechanism in response: ASAP must control the number of ASAP endpoint unreachable messages transmitted from the PU to the ENRP server. ๐Ÿšฆ
  • Threat 9) Flood of ASAP_ENDPOINT_KEEP_ALIVE messages to the PE from the ENRP server Security mechanism in response: ENRP server must control the number of ASAP_ENDPOINT_KEEP_ALIVE messages to the PE. ๐Ÿšฆ

To sum it up, threats 1-7 need security mechanisms that support authentication, integrity, data confidentiality, and protection from replay attacks. ๐ŸŒŸ

For RSerPool, we need to authenticate the following, and yes, the diagram is the whole vibe: ๐Ÿ’œ

PU <----  ENRP server (PU authenticates the ENRP server)
PE <----> ENRP server (mutual authentication)
ENRP server <-----> ENRP server (mutual authentication)

6.2. Implementing Security Mechanisms โœจ

okay so we're NOT cooking up brand-new security mechanisms just for threats 1-7 ๐Ÿ™…โ€โ™€๏ธ we borrow an existing IETF security protocol, [RFC3237], to get all the security services we need. TLS covers every single requirement, so TLS MUST be implemented ๐Ÿ” it's giving reliable, it's giving proven.

The TLS_RSA_WITH_AES_128_CBC_SHA ciphersuite MUST be supported, at a minimum, by anyone implementing TLS for RSerPool ๐Ÿ’– For backwards compatibility, ENRP SHOULD support TLS_RSA_WITH_3DES_EDE_CBC_SHA ๐Ÿ“ Implementers MAY also support any other IETF-approved ciphersuites ๐ŸŒˆ

ENRP servers, PEs, and PUs MUST implement TLS ๐ŸŽ€ ENRP servers and PEs MUST support mutual authentication using PSK ๐Ÿซถ ENRP servers MUST support mutual authentication among themselves using PSK ๐Ÿ’œ PUs MUST authenticate ENRP servers using certificates ๐Ÿ”‘

TLS with PSK is mandatory to implement as the authentication mechanism for ENRP to ENRP authentication and PE to ENRP authentication โœจ With PSK, having a pre-shared key counts as authorization ๐Ÿ—๏ธ The network admins of a pool get to decide which nodes are authorized to join the pool ๐Ÿ‘‘ The reason PSK works here is that we assume one administrative domain controls and manages the server pool, so PSK can be implemented and managed by a central security admin ๐Ÿงš

TLS with certificates is mandatory to implement as the authentication mechanism for PUs to the ENRP server ๐Ÿ’… PUs MUST authenticate ENRP servers using certificates (yes, we're saying it again because it's THAT important ๐Ÿ˜ญ). ENRP servers MUST possess a site certificate whose subject corresponds to their canonical hostname ๐ŸŒธ PUs MAY have certificates of their own for mutual authentication with TLS, but this document doesn't set out any provisions for using them ๐Ÿฆ‹ Every RSerPool element that supports TLS MUST have a mechanism for validating certificates received during TLS negotiation. That means having one or more root certificates issued by certificate authorities (ideally well-known distributors of site certificates, like the ones that issue root certificates for web browsers) ๐Ÿ›ก๏ธ

To prevent man-in-the-middle attacks ๐Ÿ‘€ the client MUST verify the server's identity, as presented in the server's Certificate message. The client's understanding of the server's identity (usually the identity it used to set up the transport connection) is called the "reference identity" ๐ŸŽฏ The client figures out the type of the reference identity (like a DNS name or an IP address) and compares it against each subjectAltName value of that type until it finds a match. Once there's a match, the server's identity is verified and the server identity check is complete โœ… Different subjectAltName types get matched in different ways, and the client may map the reference identity to a different type before comparing. Mappings can be done for all the available subjectAltName types the reference identity can map to, but the reference identity should only be mapped to types where the mapping is either inherently secure (like pulling the DNS name out of a URI to compare with a subjectAltName of type dNSName) or done in a secure way (like using DNS Security (DNSSEC), or user- or admin-configured host-to-address/address-to-host lookup tables) ๐Ÿง

If the server identity check fails ๐Ÿ’€ user-oriented clients SHOULD either notify the user or close the transport connection and indicate that the server's identity is suspect. Automated clients SHOULD close the transport connection and then return or log an error saying the server's identity is suspect, or do both. Beyond this server identity check, clients should be prepared to do further checking to make sure the server is authorized to provide the service it's been asked for. The client may need to use local policy information to make that call ๐Ÿ“‹

If the reference identity is an internationalized domain name, conforming implementations MUST convert it to the ASCII Compatible Encoding (ACE) format, as specified in Section 4 of [RFC3490], before comparing it with subjectAltName values of type dNSName ๐ŸŒ Specifically, conforming implementations MUST perform the conversion operation from Section 4 of [RFC3490] like this:

  • in step 1, the domain name SHALL be considered a "stored string";
  • in step 3, set the flag called "UseSTD3ASCIIRules";
  • in step 4, process each label with the "ToASCII" operation; and
  • in step 5, change all label separators to U+002E (full stop).

After the "to-ASCII" conversion, the DNS labels and names MUST be compared for equality using the rules in Section 3 of RFC 3490 ๐Ÿ”ค The '*' (ASCII 42) wildcard character is allowed in subjectAltName values of type dNSName, but only as the left-most (least significant) DNS label in that value ๐ŸŒŸ That wildcard matches any left-most DNS label in the server name. So the subject *.example.com matches the server names a.example.com and b.example.com, but it does NOT match example.com or a.b.example.com ๐Ÿ™…โ€โ™€๏ธ

When the reference identity is an IP address, the identity MUST be converted to the "network byte order" octet string representation, per RFC 791 [RFC0791] and RFC 2460 [RFC2460] ๐Ÿ”ข For IP version 4, as specified in RFC 791, the octet string will contain exactly four octets. For IP version 6, as specified in RFC 2460, it will contain exactly sixteen octets. That octet string then gets compared against subjectAltName values of type iPAddress. It's a match if the reference identity octet string and the value octet string are identical ๐ŸŽ‰

Once a TLS layer is set up in a session, both parties independently decide whether to keep going, based on local policy and the security level they've reached ๐Ÿค” If either party decides the security level isn't good enough to continue, it SHOULD remove the TLS layer right after the TLS (re)negotiation has finished (see RFC 4511)[RFC4511]. Implementations may re-evaluate the security level at any time and, if they find it inadequate, should remove the TLS layer ๐Ÿงน

Implementations MUST support TLS with SCTP, as described in [RFC3436], or TLS over TCP, as described in [RFC5246] ๐Ÿฆ‹ When using TLS/SCTP, we need to make sure RSerPool doesn't use any SCTP features that aren't available to a TLS/SCTP user. It's not a hard technical problem, it's just a requirement ๐Ÿ’… And when describing an API for the RSerPool lower layer, we also have to take the differences between TLS and SCTP into account ๐Ÿซถ

Threat 8 requires the ASAP protocol to limit the number of ASAP_ENDPOINT_UNREACHABLE messages (see Section 3.5 of RFC 5352) sent to the ENRP server ๐Ÿ˜ค Threat 9 requires the ENRP protocol to limit the number of ASAP_ENDPOINT_KEEP_ALIVE messages sent from the ENRP server to the PE ๐Ÿšซ

There's no security mechanism defined for multicast announcements ๐Ÿ™ˆ So a receiver of one of these announcements can't treat the source address of that message as a trustworthy address of an ENRP server. A receiver also has to be ready for a flood of multicast announcements from attackers ๐Ÿ’€ this part is seriously not fun, bestie


6.3. Chain of Trust ๐Ÿ”—

Security is mandatory to implement in RSerPool ๐Ÿ’œ It's built on TLS in all three architecture components that make up RSerPool: the PU, the PE, and the ENRP server. We define an ENRP server that uses TLS for all communication and authenticates ENRP peers and PE registrants as a secured ENRP server ๐Ÿ‘‘

Here's a look at all the possible data paths and what security each one gets ๐Ÿ‘€

PU <---> secured ENRP server (authentication of ENRP server;
         queries over TLS)
PE <---> secured ENRP server (mutual authentication;
         registration/de-registration over TLS)
secured ENRP server <---> secured ENRP server (mutual authentication;
         database updates using TLS)

If every component in the system authenticates and communicates using TLS, the chain of trust is sound โ›“๏ธโœจ The root of the trust chain is the ENRP server. If that's secured with TLS, then security gets enforced for every ENRP and PE component that tries to connect to it ๐Ÿงš

Summary of interaction between secured and unsecured components: if a PE doesn't use TLS and tries to register with a secure ENRP server, it gets an error message response flagged as a security-related error, and the registration is rejected ๐Ÿ™…โ€โ™€๏ธ If an ENRP server that doesn't use TLS tries to update the database of a secure ENRP server, the update gets rejected ๐Ÿšซ If a PU doesn't use TLS and talks to a secure ENRP server, it gets a response, but the PU knows that response isn't secure, because it can be tampered with in transit even if the ENRP database is secured ๐Ÿ˜ฌ

The final case is a PU sending a secure request to ENRP. ENRP and PEs might not be secured, and that's an allowable configuration ๐ŸŒธ The goal is to secure the communication over the Internet between the PU and the ENRP server ๐Ÿ”

Summary:

RSerPool architecture components can talk to each other to set up a chain of trust ๐Ÿค Secured PE and ENRP servers reject any communication with unsecured ENRP or PE servers ๐Ÿ›ก๏ธ

If all of the above is enforced, then a chain of trust is established for the RSerPool user ๐ŸŽ€chain of trust: certified โœจ๐ŸŒˆโœจ


7. Acknowledgments ๐Ÿซถ

The authors wish to thank John Loughney, Lyndon Ong, Walter Johnson, Thomas Dreibholz, Frank Volkmer, and many others for their invaluable comments and feedback ๐Ÿ’–

8. References ๐Ÿ“š

8.1. Normative References ๐Ÿ“š

okay bestie, these are the "read these first or you'll be lost" docs ๐Ÿง โœจ every single one is a must-read for understanding the spec ๐Ÿ’…

  • [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, September 1981.
  • [RFC1071] Braden, R., Borman, D., Partridge, C., and W. Plummer, "Computing the Internet checksum", RFC 1071, September 1988.
  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6 (IPv6) Specification", RFC 2460, December 1998.
  • [RFC3237] Tuexen, M., Xie, Q., Stewart, R., Shore, M., Ong, L., Loughney, J., and M. Stillman, "Requirements for Reliable Server Pooling", RFC 3237, January 2002.
  • [RFC3436] Jungmaier, A., Rescorla, E., and M. Tuexen, "Transport Layer Security over Stream Control Transmission Protocol", RFC 3436, December 2002.
  • [RFC3490] Faltstrom, P., Hoffman, P., and A. Costello, "Internationalizing Domain Names in Applications (IDNA)", RFC 3490, March 2003.
  • [RFC4511] Sermersheim, J., "Lightweight Directory Access Protocol (LDAP): The Protocol", RFC 4511, June 2006.
  • [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, May 2008.
  • [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, August 2008.
  • [RFC5354] Stewart, R., Xie, Q., Stillman, M., and M. Tuexen, "Aggregate Server Access Protocol (ASAP) and Endpoint Handlespace Redundancy Protocol (ENRP) Parameters", RFC 5354, September 2008.
  • [RFC5352] Stewart, R., Xie, Q., Stillman, M., and M. Tuexen, "Aggregate Server Access Protocol (ASAP)", RFC 5352, September 2008.
  • [RFC5355] Stillman, M., Ed., Gopal, R., Guttman, E., Holdrege, M., and S. Sengodan, "Threats Introduced by Reliable Server Pooling (RSerPool) and Requirements for Security in Response to Threats", RFC 5355, September 2008.

8.2. Informative References ๐ŸŒธ

these ones are the extra-credit reading, still super helpful ๐Ÿค“๐Ÿ’–

  • [RFC4086] Eastlake, D., Schiller, J., and S. Crocker, "Randomness Requirements for Security", BCP 106, RFC 4086, June 2005.
  • [SCTPSOCKET] Stewart, R., Poon, K., Tuexen, M., Yasevich, V., and P. Lei, "Sockets API Extensions for Stream Control Transmission Protocol (SCTP)", Work in Progress, July 2008.

Authors' Addresses ๐ŸŽ€

meet the squad who built this thing ๐Ÿซถ here's how to reach each of them

Qiaobing Xie
The Resource Group
1700 Pennsylvania Ave NW
Suite 560
Washington, D.C.,   20006
USA

Phone: +1 224-465-5954
EMail: Qiaobing.Xie@gmail.com


Randall R. Stewart
The Resource Group
1700 Pennsylvania Ave NW
Suite 560
Washington, D.C.,   20006
USA

Phone:
EMail: randall@lakerest.net


Maureen Stillman
Nokia
1167 Peachtree Ct.
Naperville, IL  60540
US

Phone:
EMail: maureen.stillman@nokia.com
Michael Tuexen
Muenster Univ. of Applied Sciences
Stegerwaldstr. 39
48565 Steinfurt
Germany

EMail: tuexen@fh-muenster.de


Aron J. Silverton
Sun Microsystems, Inc.
10 S. Wacker Drive
Suite 2000
Chicago, IL 60606
USA

Phone:
EMail: ajs.ietf@gmail.com

okay the legal part, but make it cute ๐ŸŽ€ the copyright is held by The IETF Trust, and the rules are the ones in BCP 78 ๐Ÿ”’

Copyright (C) The IETF Trust (2008).

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 doesn't take a side on who owns what tech in here, and it hasn't checked every possible patent either ๐Ÿง the rules for RFC rights live in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat, 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 also invites anyone to flag any copyrights, patents, patent applications, or other proprietary rights that might cover tech needed to implement this standard. send that info to the IETF at ietf-ipr@ietf.org ๐Ÿ’œ

๐Ÿ“ฆ where this page comes from