High-level Entity Management Protocol (HEMP)
A 1987 application protocol for managing hosts, gateways and front-end machines over a network.
Partridge, C. and G. Trewitt, "High-level Entity Management Protocol (HEMP)", RFC 1022, DOI 10.17487/RFC1022, October 1987, <https://www.rfc-editor.org/info/rfc1022>.
@misc{rfc1022,
series = {Request for Comments},
number = 1022,
howpublished = {RFC 1022},
publisher = {RFC Editor},
doi = {10.17487/RFC1022},
url = {https://www.rfc-editor.org/info/rfc1022},
author = {C. Partridge and G. Trewitt},
title = {{High-level Entity Management Protocol (HEMP)}},
pagetotal = 12,
year = 1987,
month = oct,
} RFC text
Contents
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.
ISO Plain Language
On this page
§1What HEMP Does
The High-Level Entity Management Protocol (HEMP) provides an encapsulation system and a set of services for communication between applications and managed entities. It is an application protocol that relies on existing transport protocols to deliver HEMP messages to their destinations, and it is a component of the High-Level Entity Management System (HEMS) described in RFC 1021. The protocol is targeted at management interactions between applications and entities, and is believed suitable for both monitoring and control interactions.
The authors state that HEMP provides what they believe are the three essential features of a management protocol: a standard encapsulation scheme for all interactions, an authentication facility that can be used both to verify messages and to limit access to managed systems, and the ability to encrypt messages to protect sensitive information.
A HEMP message is an arbitrarily long sequence of octets. The memo assumes a knowledge of ASN.1, the ISO data encoding standard, whose two parts are International Standard 8824 for the specification and International Standard 8825 for the encoding rules.
HEMP is the language a manager program uses to talk to a device it looks after. It is an application protocol, so it sits on top of an ordinary transport such as TCP rather than replacing it. It aims to cover both watching a device and commanding it.
§2Requests, Replies and Events
Five types of messages are 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 kinds of interaction are envisaged. A message exchange happens between an application and an entity managed by that application: the application sends a request to retrieve information or give instructions, and the entity replies with a response, either a reply message if the request was valid or an error message if it was not, for example because authentication failed. One response per request is expected, though the protocol does not preclude several. The second kind of interaction is unsolicited messages from an entity to the management centres responsible for managing it.
Event messages are unsolicited notices sent by an entity to an address that is expected to correspond to one or more management centres. A single address may correspond to a multicast address and so reach multiple hosts. Events typically alert management centres to important changes in the entity's state, such as an interface going down or the entity running out of network buffers.
Protocol error messages are generated when errors are found while processing the HEMP encapsulation of the message. Errors that occur during the processing of the message contents are application errors. Because the processing agent may have started sending a reply before an error is discovered, an application error may show up inside the reply message instead of in a separate message. Entities are not required to send error messages, because on secure networks that may be undesirable, although on friendly networks their use is encouraged.
A manager asks a device a question with a request, and the device answers with a reply or an error. A device can also send an event on its own to announce something, such as an interface going down, and one event address can reach several management centres at once. Error messages are optional, because a reply that says nothing may be safer on a secure network.
- REQUESTRetrieve information or give instructions.
- REPLYSent if the request was valid.
- ERRORProtocol or application error; optional on secure networks.
- EVENTUnsolicited notice, for example that an interface went down.
§3The Shape of a HEMP Message
Every HEMP message has the same general form, shown in Figure 1 of the RFC: a leader, then the encryption section, the reply encryption section, the authentication section, the common header, and the data section. The leader is simply the ASN.1 tag and the message length, and the sections are also encoded in ASN.1, as the following definition shows.
HempMessage ::= [0] IMPLICIT SEQUENCE { [0] IMPLICIT EncryptSection OPTIONAL, [1] IMPLICIT ReplyEncryptSection OPTIONAL, [2] IMPLICIT AuthenticateSection OPTIONAL, [3] IMPLICIT CommonHeader, [4] IMPLICIT Data }The order of the sections is significant. The encryption section comes first so that all the sections after it, which may contain sensitive information, can be encrypted. The authentication section comes before the header so that a message that fails authentication can be discarded without the header being processed at all.
The common header holds generic information about the message. It contains a link field, which indicates which version of HEMS is in use; a messageType field, whose value is request (0), reply (1), event (2), protocol error (3) or application error (4); a messageId, a unique bit identifier that is set in the request message and echoed in the response so that applications can match a response to its request; and a resourceId, which is defined for ISO compatibility and corresponds to the resource ID used by the Common Management Information Protocol.
The messageId should be chosen so that a substantial period of time elapses before it is reused by a particular application, even across machine crashes. Event messages use the same field to carry the number of the current event, so that comparing the numbers of events that were lost detects gaps. The event messageId should be reset to 0 on every reboot, and by convention the event message with a messageId of 0 is always a reboot event.
The data section contains the message specific data. Its format is ASN.1 ANY, and its contents are application specific and, with the exception of protocol error messages, outside the scope of the memo.
Every HEMP message is a stack of parts in a fixed order, so a receiver always knows where to look. The parts that need protecting come before the parts that describe the message, which lets a receiver throw a bad message away before it even reads the header.
- HempMessage Every section is encoded in ASN.1
- EncryptSection optional
- encryptType
- encryptData
- ReplyEncryptSection optional
- replyEncryptType
- replyEncryptData
- AuthenticateSection optional
- authenticateType
- authenticateData
- CommonHeader
- link
- messageType
- messageId
- resourceId
- Data application specific
- EncryptSection optional
§4Authenticating and Encrypting Messages
The authentication section contains the data a receiver needs to authenticate the message, and it is a sequence of an authenticateType number and an authenticateData field. If the section is omitted, the message is not authenticated. Two types are defined. The password scheme uses authenticateType 1 with the password as an octet string of any length: the entity checks it against an entity-specific password assigned to that entity, and accepts the request for processing if they match. Authentication by encryption method uses authenticateType 2 with a NULL data field, which says that authentication was implicit in the encryption method; recipients should confirm that the encryption method does indeed provide authentication.
If a message fails authentication it should be discarded. If the authentication type is unknown or the section is omitted, the message may be discarded or processed at the discretion of the implementation, and requests with unknown authentication types are recommended to be logged as potential intrusions but not processed.
The encryption section holds the data needed to decrypt the message, again as a type number and an ANY field. If it is omitted, no decryption is required. If it is present, the type number names the encryption method and the data field holds whatever the receiver must have, for example a key. If the message has been encrypted, data is encrypted starting with the first octet after the encryption section. No encryption types are assigned at the time of writing.
The reply encryption section lets a management agent ask for a response that is encrypted even when the request was not, or encrypted with a different key or a different scheme. It has the same shape, with replyEncryptType and replyEncryptData. If it is omitted, the reply should be encrypted in the manner specified by the encryption section. If it is present, the reply must contain an appropriate encryption section that says the requested method is in use. If the entity does not support the requested reply encryption method, it may send no reply at all, and may at the discretion of the implementor send a protocol error message.
The RFC notes that encryption in HEMP does not protect against traffic analysis, because HEMP interactions are expected to have distinct signatures, and suggests link-level encryption for organizations concerned at that level.
Two optional parts of a HEMP message protect it. The authentication part says who sent the message, either with a password checked against one held by the device or by pointing to the encryption method that already proves it. The encryption part tells the receiver how to decrypt the rest. A request can also ask for a reply to be encrypted in a particular way.
§5Protocol Error Messages
Protocol error messages are tied closely to the definition of HEMP, so the memo defines the contents of the data section for them. The format was chosen to agree with the error message format and ASN.1 type used for language processing errors in RFC 1024, and the error codes were chosen so that they do not overlap. The data section holds a protoErrorCode, a protoErrorOffset and a protoErrorDescribed string. The offset is the number of the octet in which the error was discovered, with the first octet in the message being octet number 0, and the description gives more detail about the particular error.
The defined codes are 0, reserved and not used; 1, an ASN.1 format error such as an unknown type or a violation of the ASN.1 syntax; 2, a wrong HEMP version number, which the RFC says may be an indication of possible network intrusion and should be logged at sites concerned with security; 3, an authentication error, which is defined for completeness but strongly discouraged in use, because returning authentication failure information may aid intruders in cracking the authentication system, and which is recommended to be logged as a possible security problem; 4, a reply encryption type that is not supported; 5, a failure to decrypt, which means the entity could not read the common header to find the messageId, so the messageId field should be set to 0; and 6, an application failure that made it impossible to process the message.
When something goes wrong before the request can be understood, the device can answer with a protocol error that names the kind of fault and points at the octet where it was found. The RFC is careful about the authentication error, because telling a stranger that a password failed helps them guess it.
§6Choosing a Transport Protocol
The RFC reports considerable debate about the transport protocol to use under HEMP, part of the problem being that HEMP is used for two different kinds of interaction. Request-response exchanges may involve arbitrary amounts of data in both directions and are believed to require a reliable transport mechanism, while event messages are typically small and need not be reliably delivered.
Public opinion seemed to lean towards running HEMP over a transaction protocol, as discussed generally in RFC 955, but the community was still experimenting with transaction protocols and many groups wanted to implement HEMP now. The memo therefore defines two transport protocols for use with HEMP. Groups that want an implementation in the near future should use a combination of the Transmission Control Protocol (TCP) and the User Datagram Protocol (UDP) under HEMP: TCP for all request-response interactions, and UDP to send event messages. Using UDP to support request-response interactions is strongly discouraged.
More forward-looking groups are encouraged to implement HEMP over a transaction protocol, in particular the Versatile Message Transaction Protocol (VMTP), for which experiments were planned.
Requests carry a lot of data and need a reliable connection, so they go over TCP. Events are small and need not arrive, so they go over UDP. The RFC also points at transaction protocols as the better long-term choice.