RFC 1022 UNKNOWN NETWORK MANAGEMENT · ASN.1

High-level Entity Management Protocol (HEMP)

The message envelope HEMS uses to monitor and control hosts, gateways and other network entities.

On rfc-editor.org ↗
PUBLISHED
October 1987
AUTHORS
C. Partridge, G. Trewitt
STREAM
Legacy
MESSAGE TYPES
5: request, reply, event, protocol error, application error
PASSWORD AUTHENTICATION TYPE
1
ENCRYPTION AUTHENTICATION TYPE
2
PROTOCOL ERROR CODES
0 to 6
TRANSPORTS
TCP for request-response, UDP for events
DOI
10.17487/RFC1022

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                                      C. Partridge
Request For Comment: 1022                                      BBN/NNSC
                                                             G. Trewitt
                                                               Stanford
                                                           October 1987

          THE HIGH-LEVEL ENTITY MANAGEMENT PROTOCOL (HEMP)

STATUS OF THIS MEMO

   An application protocol for managing network entities such as hosts,
   gateways and front-end machines, is presented.  This protocol is a
   component of the High-Level Entity Management System (HEMS) described
   in RFC-1021.  Readers may want to consult RFC-1021 when reading this
   memo.  This memo also assumes a knowledge of the ISO data encoding
   standard, ASN.1.  Distribution of this memo is unlimited.

PROTOCOL OVERVIEW

   The High-Level Entity Management Protocol (HEMP) provides an
   encapsulation system and set of services for communications between
   applications and managed entities.  HEMP is an application protocol
   which relies on existing transport protocols to deliver HEMP messages
   to their destination(s).

   The protocol is targeted for management interactions between
   applications and entities.  The protocol is believed to be suitable
   for both monitoring and control interactions.

   HEMP provides what the authors believe are the three essential
   features of a management protocol:  (1) a standard encapsulation
   scheme for all interactions, (2) an authentication facility which can
   be used both to verify messages and limit access to managed systems,
   and (3) the ability to encrypt messages to protect sensitive
   information.  These features are discussed in detail in the following
   sections.

PROTOCOL OPERATION

   HEMP is designed to support messages; where a message is an
   arbitrarily long sequence of octets.

   Five types of messages are currently defined: request, event, reply,
   and protocol error, and application error messages.  Reply, protocol
   error and application error messages are only sent in reaction to a
   request message, and are referred to collectively as responses.

   Two types of interaction are envisioned: a message exchange between
   an application and an entity managed by the application, and
   unsolicited messages from an entity to the management centers
   responsible for managing it.

   When an application wants to retrieve information from an entity or
   gives instructions to an entity, it sends a request message to the
   entity.  The entity replies with a response, either a reply message
   if the request was valid, or an error message if the request was
   invalid (e.g., failed authentication).  It is expected that there
   will only be one response to a request message, although the protocol
   does not preclude multiple responses to a single request.

   Protocol error messages are generated if errors are found when
   processing the HEMP encapsulation of the message.  The possible
   protocol error messages are described later in this document.  Non-
   HEMP errors (e.g., errors that occur during the processing of the
   contents of the message) are application errors.  The existence of
   application error messages does not preclude the possibility that a
   reply will have an error message in it.  It is expected that the
   processing agent on the entity may have already started sending a
   reply message before an error in a request message is discovered.  As
   a result, application errors found during processing may show up in
   the reply message instead of a separate application error message.

   Note that in certain situations, such as on secure networks,
   returning error messages may be considered undesirable.  As a result,
   entities are not required to send error messages, although on
   "friendly" networks the use of error messages is encouraged.

   Event messages are unsolicited notices sent by an entity to an
   address, which is expected to correspond to one or more management
   centers.  (Note that a single address may correspond to a multicast
   address, and thus reach multiple hosts.)  Event messages are
   typically used to allow entities to alert management centers of
   important changes in their state (for example, when an interface goes
   down or the entity runs out of network buffers).

STANDARD MESSAGE FORMAT

   Every HEMP message is put in the general form shown in Figure 1.

                     +-------------------------------+
                     :           leader              :
                     +-------------------------------+
                     :       encryption section      :
                     +-------------------------------+
                     :    reply encryption section   :
                     +-------------------------------+
                     :     authentication section    :
                     +-------------------------------+
                     :          common header        :
                     +-------------------------------+
                     :              data             :
                     +-------------------------------+

                  Figure 1: General Form of HEMP Messages

   Each message has five components: (1) the leader, which is simply the
   ASN.1 tag and message length; (2) the encryption section, which
   provides whatever information the receiver may require to decrypt the
   message; (3) the reply encryption section, in which the requesting
   application may specify the type of encryption to use in the reply;
   (4) the authentication section, which allows the receiver to
   authenticate the message; (5) the common header, which identifies the
   message type, the HEMP version, and the message id; and (6) the data
   section.  All four sections following the leader are also ASN.1
   encoded.  The ASN.1 format of the message is shown in Figure 2.

          HempMessage ::= [0] IMPLICIT SEQUENCE {
              [0] IMPLICIT EncryptSection OPTIONAL,
              [1] IMPLICIT ReplyEncryptSection OPTIONAL,
              [2] IMPLICIT AuthenticateSection OPTIONAL,
              [3] IMPLICIT CommonHeader,
              [4] IMPLICIT Data }

                  Figure 2: ASN.1 Format of HEMP Messages

   The ordering of the sections is significant.  The encryption section
   comes first so that all succeeding sections (which may contain
   sensitive information) may be encrypted.  The authentication section
   precedes the header so that messages which fail authentication can be
   discarded without header processing.

THE ENCRYPTION SECTION

Need For Encryption

   Encryption must be supported in any management scheme.  In
   particular, a certain amount of monitoring information is potentially
   sensitive.  For example, imagine that an entity maintains a traffic
   matrix, which shows the number of packets it sent to other entities.
   Such a traffic matrix can reveal communications patterns in an
   organization (e.g., a corporation or a government agency).
   Organizations concerned with privacy may wish to employ encryption to
   protect such information.  Access control ensures that only people
   entitled to request the data are able to retrieve it, but does not
   protect from eavesdroppers reading the messages.  Encryption protects
   against eavesdropping.

   Note that encryption in HEMP does not protect against traffic
   analysis.  It is expected that HEMP interactions will have distinct
   signatures such that a party which can observe traffic patterns may
   guess at the sort of interactions being performed, even if the data
   being sent is encrypted.  Organizations concerned with security at
   this level should additionally consider link-level encryption.

Format of the Encryption Section

   The encryption section contains any data required to decrypt the
   message.  The ASN.1 format of this section is shown in Figure 3.

          EncryptSection :: = IMPLICIT SEQUENCE {
                encryptType INTEGER,
                encryptData ANY
          }

                Figure 3: ASN.1 Format of Encryption Section

   If the section is omitted, then no decryption is required.  If the
   section is present, then the encryptType field contains a number
   defining the encryption method in use and encryptData contains
   whatever data, for example a key, which the receiver must have to
   decrypt the remainder of the message using the type of encryption
   specified.

   Currently no encryption types are assigned.

   If the message has been encrypted, data is encrypted starting with
   the first octet after the encryption section.

THE REPLY ENCRYPTION SECTION

Need for Reply Encryption

   The reasons for encrypting messages have already been discussed.

   The reply encryption section provides the ability for management
   agents to request that responses be encrypted even though the
   requests are not encrypted, or that responses be encrypted using a
   different key or even a different scheme from that used to encrypt
   the request.  A good example is a public key encryption system, where
   the requesting application needs to pass its public key to the
   processing agent.

Format of the Reply Encryption Section

   The reply encryption section contains any data required to encrypt
   the reply message.  The ASN.1 format of this section is shown in
   Figure 4.

          ReplyEncryptSection :: = IMPLICIT SEQUENCE {
                replyEncryptType INTEGER,
                replyEncryptData ANY
          }

          Figure 4: ASN.1 Format of Reply Encryption Section

   If the section is omitted, then the reply should be encrypted in the
   manner specified by the encryption section.  If the section is
   present, then the replyEncryptType field contains a number defining
   the encryption method to use and replyEncryptData contains whatever
   data, for example a key, which the receiver must have to encrypt the
   reply message.

   If the reply encryption section is present, then the reply message
   must contain an appropriate encryption section, which indicates the
   encryption method requested in the reply encryption section is in
   use.  The reply message should be encrypted starting with the first
   octet after the encryption section.

   If the reply encryption method requested is not supported by the
   entity, the entity may not send a reply.  It may, at the discretion
   of the implementor, send a protocol error message.  (See below for
   descriptions of protocol error messages.)

   Currently no encryption types are assigned.

THE AUTHENTICATION SECTION

Need for Authentication

   It is often useful for an application to be able to confirm either
   that a message is indeed from the entity it claims to have originated
   at, or that the sender of the message is accredited to make a
   monitoring request, or both.  An example may be useful here.
   Consider the situation in which an entity sends a event message to a
   monitoring center which indicates that a trunk link is unstable.
   Before the monitoring center personnel take actions to re-route
   traffic around the bad link (or makes a service call to get the link
   fixed), it would be nice to confirm that the event was indeed sent by
   the entity, and not by a prankster.  Authentication provides this
   facility by allowing entities to authenticate their event messages.

   Another use of the authentication section is to provide access
   control.  Requests demand processing time from the entity.  In cases
   where the entity is a critical node, such as a gateway, we would like
   to be able to limit requests to authorized applications.  We can use
   the authentication section to provide access control, by only
   allowing specially authenticated applications to request processing
   time.

   It should also be noted that, in certain cases, the encryption method
   may also implicitly authenticate a message.  In such situations, the
   authentication section should still be present, but uses a type code
   which indicates that authentication was provided by the encryption
   method.

Format of the Authentication Section

   The authentication section contains any data required to allow the
   receiver to authenticate the message.  The ASN.1 format of this
   section is shown in Figure 5.

         AuthenticateSection :: = IMPLICIT SEQUENCE {
                authenticateType INTEGER,
                authenticateData ANY
               }


             Figure 5: ASN.1 Format of Authentication Section

   If the section is omitted, then the message is not authenticated.  If
   the section is present, then the authenticateType defines the type of
   authentication used and the authenticateData contains the
   authenticating data.

   This memo defines two types of authentication, a password scheme and
   authentication by encryption method.  For the password scheme, the
   AuthenticateSection has the form shown in Figure 6.

         AuthenticateSection :: = IMPLICIT SEQUENCE {
                authenticateType INTEGER { password(1) },
                authenticateData OCTETSTRING
          }

          Figure 6: ASN.1 Format of Password Authentication Section

   The authenticateType is 1, and the password is an octet string of any
   length.  The system is used to validate requests to an entity.  Upon
   receiving a request, an entity checks the password against an entity
   specific password which has been assigned to the entity.  If the
   passwords match, the request is accepted for processing.  The scheme
   is a slightly more powerful password scheme than that currently used
   for monitoring on the Internet.

   For authentication by encryption, the AuthenticateSection has the
   format shown in Figure 7.

         AuthenticateSection :: = IMPLICIT SEQUENCE {
                authenticateType INTEGER { encryption(2) },
                authenticateData NULL
          }

          Figure 7: ASN.1 Format of Encryption Authentication Section

   This section simply indicates that authentication was implicit in the
   encryption method.  Recipients of such messages should confirm that
   the encryption method does indeed provide authentication.

   No other authentication types are currently defined.

   If a message fails authentication, it should be discarded.  If the
   type of authentication used on the message is unknown or the section
   is omitted, the message may be discarded or processed at the
   discretion of the implementation.  It is recommended that requests
   with unknown authentication types be logged as potential intrusions,
   but not processed.

THE COMMON HEADER

   The common header contains generic information about the message such
   as the protocol version number and the type of request.  The ASN.1
   format of the common header is shown in Figure 8.

           CommonHeader ::= IMPLICIT SEQUENCE {
               link IMPLICIT INTEGER,
               messageType IMPLICIT INTEGER,
               messageId IMPLICIT INTEGER,
               resourceId ANY
           }


                  Figure 8: ASN.1 Format of Common Header

   The link indicates which version of HEMS is in use.

   The messageType is a value indicating whether the message is a
   request (0), reply (1), event (2), protocol error (3) or application
   error (4) message.

   The messageId is a unique bit identifier, which is set in the request
   message, and echoed in the response.  It allows applications to match
   responses to their corresponding request.  Applications should choose
   messageIds such that a substantial period of time elapses before a
   messageId is re-used by a particular application (even across machine
   crashes).

   Event messages also use the messageId field to indicate the number of
   the current event message.  By comparing messageId fields from events
   lost, event values may be detected.  The event messageId should be
   reset to 0 on every reboot, and by convention, the event message with
   messageId of 0 should always be a "reboot" event.  (Facilities should
   be provided in the event message definition to allow entities which
   are capable of storing messageIds across reboots to send the highest
   messageId reached before the reboot.)

   The resourceId is defined for ISO compatibility and corresponds to
   the resource ID used by the Common Management Information Protocol to
   identify the relevant ISO resource.

DATA SECTION

   The data section contains the message specific data.  The format of
   the data section is shown in Figure 9.

                   Data ::= ANY

                  Figure 9: ASN.1 Format of Data Section

   The contents of the data section is application specific and, with
   the exception of protocol error messages, is outside the scope of
   this memo.

TRANSPORT PROTOCOL

   There has been considerable debate about the proper transport
   protocol to use under HEMP.  Part of the problem is that HEMP is
   being used for two different types of interactions:  request-response
   exchanges and event messages.  Request-response interactions may
   involve arbitrary amounts of data being sent in both directions, and
   is believed to require a reliable transport mechanism.  Event
   messages are typically small and need not be reliably delivered.

   Public opinion seems to lean towards running HEMP over a transaction
   protocol (see RFC-955 for a general discussion).  Unfortunately, the
   community is still experimenting with transaction protocols, and many
   groups would like to be able to implement HEMP now.  Accordingly,
   this memo defines two transport protocols for use with HEMP.

   Groups interested in using an implementation of HEMP and the HEMS in
   the near future should use a combination of the Transmission Control
   Protocol (TCP) and the User Datagram Protocol (UDP) under HEMP.  TCP
   should be used for all request-response interactions and UDP should
   be used to send event messages.  Using UDP to support the request-
   response interactions is strongly discouraged.

   More forward looking groups are encouraged to implement HEMP over a
   transaction protocol, in particular, experiments are planned with the
   Versatile Message Transaction Protocol (VMTP).

PROTOCOL ERROR MESSAGES

   Protocol error messages are so closely tied to the definition of HEMP
   that it made sense to define the contents of the data section for
   protocol error messages in this memo, even though the data section is
   generally considered application specific.

   The data section of all protocol error messages has the same format,
   which is shown in Figure 10.  This format has been chosen to agree
   with the error message format and ASN.1 type used for language
   processing errors in RFC-1024, and the error codes have been chosen
   such that they do not overlap.

           ProtocolError ::= [APPLICATION 0] implicit sequence {
               protoErrorCode INTEGER,
               protoErrorOffset INTEGER,
               protoErrorDescribed IA5String,
           }

            Figure 10: Data Section For Protocol Error Messages

   The protoErrorCode is a number which specifies the particular type of
   error encountered.  The defined codes are:

           0 - reserved <not used>

           1 - ASN.1 format error.  Some error has been encountered
           in parsing the message.  Examples of such an error are an
           unknown type or a violation of the ASN.1 syntax.

           2 - Wrong HEMP version number.  The version number in
           the common header is invalid.  Note that this may
           be an indication of possible network intrusion and
           should be logged at sites concerned with security.

           3 - Authentication error.  Authentication has failed.
           This error code is defined for completeness, but
           implementations are *strongly* discouraged from using
           it.  Returning authentication failure information may
           aid intruders in cracking the authentication system.
           It is recommended taht authentication errors be logged
           as possible security problems.

           4 - ReplyEncryption type not supported.  The entity
           does not support the encryption method requested in the
           ReplyEncryption section.

           5 - Decryption failed.  The entity could not decrypt the
           encrypted message.  Note that this means that the
           entity could not read the CommonHeader to find the
           messageId for the reply.  In this case, the messageId
           field should be set to 0.

           6 - Application Failed.  Some application failure made it
           impossible to process the message.

   The protoErrorOffset is the number of the octet in which the error
   was discovered.  The first octet in the message is octet number 0.

   The protoErrorDescribed field is a string which describes the
   particular error.  This description is expected to give a more
   detailed description of the particular error encountered.

APPENDIX OF TYPES

   This section lists all ASN.1 types defined in this document.

   HEMP Types

          HempMessage ::= [0] IMPLICIT SEQUENCE {
              [0] IMPLICIT EncryptSection OPTIONAL,
              [1] IMPLICIT ReplyEncryptSection OPTIONAL,
              [2] IMPLICIT AuthenticateSection OPTIONAL,
              [3] IMPLICIT CommonHeader,
              [4] IMPLICIT Data }

       EncryptSection :: = IMPLICIT SEQUENCE {
           encryptType INTEGER,
           encryptData ANY
       }

       ReplyEncryptSection :: = IMPLICIT SEQUENCE {
           replyEncryptType INTEGER,
           replyEncryptData ANY
       }


       AuthenticateSection :: = IMPLICIT SEQUENCE {
           authenticateType INTEGER,
           authenticateData ANY
       }


       CommonHeader ::= IMPLICIT SEQUENCE {
           link IMPLICIT INTEGER,
           messageType IMPLICIT INTEGER {
               request(0), reply(1), event(2),
               protocol error (3), application error(4)
           }
           messageId IMPLICIT INTEGER,
           resourceId ANY
       }

       Data ::= ANY

Protocol Error Types

       ProtocolError ::= [APPLICATION 0] implicit sequence {
           protoErrorCode INTEGER,
           protoErrorOffset INTEGER,
           protoErrorDescribed OCTETSTRING
       }

REFERENCES

   ISO Standard ASN.1 (Abstract Syntax Notation 1).  It comes in two
   parts:
      International Standard 8824 -- Specification (meaning, notation)
      International Standard 8825 -- Encoding Rules (representation)

   The current VMTP specification is available from David Cheriton of
   Stanford University.

AI ELI5

On this page
PROBLEMManaging hosts, gateways and front-end machines from afar needs a common way to wrap every request and reply, check who sent it, and keep sensitive data private.
MECHANISMHEMP wraps each message in an ASN.1 envelope with optional encryption, reply encryption and authentication sections, then a common header and an application-specific data section. It runs over TCP for request-response and UDP for events.
THE CATCHThe memo defines the envelope and the protocol error messages only. No encryption types are assigned, and the contents of the data section are left to the applications.

§1What HEMP Is and How It Is Used

The High-Level Entity Management Protocol (HEMP) is an application protocol for managing network entities such as hosts, gateways and front-end machines. It is one component of the High-Level Entity Management System (HEMS) described in RFC 1021, and it relies on existing transport protocols to carry its messages.

The authors name three essential features of a management protocol: a standard encapsulation scheme for all interactions, an authentication facility that can verify messages and limit access, and the ability to encrypt messages to protect sensitive information. HEMP is meant for both monitoring and control.

A message is an arbitrarily long sequence of octets. Five types are defined: request, reply, event, protocol error and application error. Reply, protocol error and application error messages are sent only in reaction to a request, and are called responses.

An application sends a request to an entity and normally gets one response: a reply if the request was valid, or an error message if it was not (for example, if authentication failed). Protocol errors come from problems with the HEMP encapsulation itself; anything that goes wrong while processing the contents is an application error. Because the entity may already be sending a reply when it finds such a problem, an application error may show up inside the reply instead of as a separate message.

Entities are not required to send error messages, since on secure networks returning them may be undesirable. They are encouraged on friendly networks.

Event messages are unsolicited notices from an entity to an address expected to correspond to one or more management centers, possibly a multicast address. They typically report important state changes, such as an interface going down or the entity running out of network buffers.

You can ask a machine a question and get an answer back, or the machine can shout on its own when something goes wrong, like a smoke alarm.

§2The Standard Message Format

Every HEMP message has the same general form, written in ASN.1: a leader (the ASN.1 tag and message length), then an optional encryption section, an optional reply encryption section, an optional authentication section, a mandatory common header and a data section. The four sections after the leader are also ASN.1 encoded.

The order matters. The encryption section comes first so everything after it, which may be sensitive, can be encrypted. The authentication section comes before the header so that a message failing authentication can be discarded without any header processing.

The common header holds the link (which version of HEMS is in use), the messageType (request 0, reply 1, event 2, protocol error 3, application error 4), a messageId and a resourceId. The messageId is set in a request and echoed in the response so the application can match them up; applications should avoid reusing one for a substantial time, even across machine crashes. For events, the messageId counts event messages so lost ones can be detected; it resets to 0 on each reboot, and by convention event 0 is a reboot event. The resourceId exists for ISO compatibility and matches the resource ID used by the Common Management Information Protocol.

The data section is application specific, and outside this memo except for protocol error messages.

Each message is like a letter with layers: a lock, a password, a label with a number, and then the real note inside. The password check comes early so a fake letter gets thrown out fast.

HEMP MESSAGE SECTIONS, IN ORDER (RFC 1022)
  1. LeaderASN.1 tag and message length
  2. Encryption sectionOptional; what the receiver needs to decrypt
  3. Reply encryption sectionOptional; how to encrypt the reply
  4. Authentication sectionOptional; lets the receiver authenticate the message
  5. Common headerlink, messageType, messageId, resourceId
  6. DataApplication specific

§3Encryption and Reply Encryption

Monitoring data can be sensitive. A traffic matrix, for example, can reveal communication patterns in an organization. Access control stops unauthorized people from asking, but only encryption stops eavesdroppers. The RFC notes that HEMP encryption does not protect against traffic analysis, and suggests link-level encryption for organizations concerned about that.

The encryption section carries an encryptType number and encryptData (for example a key). If it is omitted, no decryption is needed. If present, data is encrypted starting with the first octet after the section.

The reply encryption section lets the requester ask for the reply to be encrypted even if the request was not, or with a different key or scheme, as with a public key system. If omitted, the reply uses the method in the encryption section. If an entity does not support the requested method it may send no reply, or, at the implementor's discretion, a protocol error. The RFC states that currently no encryption types are assigned.

You can tell the machine to lock its answer with a special key so nobody on the way can read it. The memo leaves the actual lock types for later.

§4Authentication

Authentication lets a receiver confirm that a message really came from the claimed entity, or that the sender is allowed to ask. The RFC gives two reasons: trusting an event such as an unstable trunk link before re-routing traffic, and limiting requests to authorized applications, since requests cost an entity processing time.

The authentication section has an authenticateType and authenticateData. If it is omitted, the message is not authenticated. Two types are defined: password(1), where the data is an octet string of any length compared against a password assigned to the entity, and encryption(2), which only states that the encryption method already authenticates the message (the receiver should confirm that it does). The RFC calls the password scheme slightly more powerful than the password scheme then used for monitoring on the Internet.

A message that fails authentication should be discarded. If the type is unknown or the section is missing, the implementation may discard or process it, but requests with unknown authentication types should be logged as potential intrusions and not processed.

The password part is like a knock at the door: the machine only listens if you give the right knock. If the knock is wrong, it ignores you.

§5Protocol Error Messages

Protocol error messages are the one case where this memo defines the data section. It holds a protoErrorCode, a protoErrorOffset (the number of the octet where the error was found, counting the first octet as 0) and a protoErrorDescribed string. The format matches the language processing error format in RFC 1024, with codes chosen so they do not overlap.

The message for code 3 is defined for completeness, but implementations are strongly discouraged from sending it, since reporting authentication failures may help intruders. The RFC recommends logging them as possible security problems instead. A wrong version number (code 2) may also signal intrusion and should be logged at security-conscious sites. For code 5, the entity could not read the common header, so the messageId in the error is set to 0.

If a message is garbled, the machine can send back a note saying what went wrong and where. It stays quiet about wrong passwords so burglars learn nothing.

PROTOCOL ERROR CODES (RFC 1022)
  • 0Reserved — Not used.
  • 1ASN.1 format error — Error in parsing the message, such as an unknown type or invalid ASN.1 syntax.
  • 2Wrong HEMP version — Version number in the common header is invalid; possible intrusion.
  • 3Authentication error — Authentication failed; sending it is strongly discouraged.
  • 4ReplyEncryption not supported — The entity does not support the requested reply encryption.
  • 5Decryption failed — The entity could not decrypt the message; messageId is set to 0.
  • 6Application failed — An application failure made it impossible to process the message.

§6Transport Protocols

The authors say there was considerable debate about the right transport. Request-response exchanges can move arbitrary amounts of data in both directions and are believed to need reliable transport. Events are small and need not be delivered reliably. Opinion leaned toward a transaction protocol (see RFC 955), but the community was still experimenting.

So the memo defines two transports for near-term use: TCP for all request-response interactions and UDP for event messages. Using UDP for request-response is strongly discouraged. Forward-looking groups are encouraged to use a transaction protocol, and experiments with the Versatile Message Transaction Protocol (VMTP) were planned.

Questions and answers go by the careful delivery service, because they can be big. Quick alarm shouts go by the fast, no-promises service.

§7References