[Docs] [txt|pdf] [Tracker] [Email] [Diff1] [Diff2] [Nits]
Versions: 00 01 02 03 04 05 RFC 4373
Individual Submission to ldup working group R. Harrison
Internet Draft J. Sermersheim
Document: draft-rharrison-lburp-01.txt Novell, Inc.
Category: Proposed Standard March, 2000
LDAP Bulk Update/Replication Protocol
Status of this Memo
This document is an Internet-Draft and is in full conformance with
all provisions of Section 10 of RFC2026.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as Internet-
Drafts. Internet-Drafts are draft documents valid for a maximum of
six months and may be updated, replaced, or obsoleted by other
documents at any time. It is inappropriate to use Internet- Drafts
as reference material or to cite them other than as "work in
progress."
The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt
The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.
1. Abstract
The protocol described in this document allows an LDAP client (a
genuine client or an LDAP server acting as a client) to perform a
bulk update to a replica on an LDAP server. The protocol groups a
set of update operations using the LDAP framed protocol requests
defined in [FRAMING] to notify the client that the update operations
in the framed set are related. The update operations within the
framed set are LDAP v3 extended operations each containing a
sequence number and one or more update LDAP v3 update operations.
The sequence number allows the server to process the update
operations in the proper order even when they are sent
asynchronously by the client, and the update operations can be
grouped within the extended request to maximize the efficiency of
client-server communication.
The protocol may be used to initialize all of the entries in an LDAP
replica or to incrementally change the existing entries in an LDAP
replica. It is suitable for client utilities that need to
efficiently initialize a replica with many entries or efficiently
make a substantial set of update changes to a replica. It is also
suitable as a protocol for replication between a single master
replica and its slave replicas.
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 1
LDAP Bulk Update/Replication Protocol March, 2000
2. Conventions used in this document
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in
this document are to be interpreted as described in RFC-2119
[ReqsKeywords].
The term supplier applies to an LDAP client or and LDAP server
(acting as a client) that supplies a set of update operations to a
consumer. The term consumer applies to an LDAP server that consumes
(processes) the update operations sent to it by a supplier.
3. Motivation for protocol
This protocol arose from the need to allow LDAP clients to
efficiently present large quantities of updates to an LDAP server
and have the LDAP server efficiently process them. This protocol
introduces a minimum of new operational functionality to the LDAP
protocol since the update requests sent by the client encapsulate
standard LDAP [LDAPv3] update operations. However, this protocol
greatly facilitates this process by allowing the client to present
the update operations asynchronously and still allow the server to
maintain proper ordering of the operations. It also allows the
server to recognize the clientÆs intent to perform a potentially
large set of update operations and then to change its processing
strategy to be more efficient than it otherwise could be.
In effect, this protocol gives a hint to the server that the LDAP
operations framed within it can be treated in a special way because
they are related to each other. The server may then take actions
that would not otherwise be practical to speed the processing of the
updates. Examples of such actions include refusing to perform
operations for other clients during the update sequence and grouping
update operations into a single transaction rather than applying
them to the DIT singly.
Additionally, this protocol deals with a common interoperability
problem in this space caused by implementations having different
requirements and abilities for handling linear and circular
dependencies as entries are created. A common application of this
protocol is anticipated to be the initialization or update of an
LDAP replica from a set of records represented in an [LDIF] file.
Due to the abilities of various implementations, these files often
contain "out-of-order" records where an entry is created before its
parent or it is made a member of a group before the member's entry
has been created. Some implementations create temporary holding
objects to deal with these issues, but others do not. This protocol
allows the server to reorder update operations in a limited way to
deal with such cases.
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 2
LDAP Bulk Update/Replication Protocol March, 2000
4. Overview of protocol
The bulk replication/update protocol utilizes framing described in
[FRAMING] to group a set of update operations to be applied to a
naming context. The update operations are sent via LDAP v3 extended
operations, each of which contains a sequence number and a list of
one or more update operations to be performed by the consumer.
Except for the fact that they are grouped together as part of a
larger LDAP v3 extended request, the update operations in each
subset are normal LDAP v3 update operations and use the encoding
specified in [LDAPv3].
4.1. Update Initiation
The protocol is initiated when a supplier sends a
StartFramedProtocolRequest extended operation to a consumer to
notify it that the following stream of LDAP update operations are to
be treated as a unit of update information. The consumer responds to
the StartFramedProtocolRequest with a StartFramedProtocolResponse.
4.2. Update Stream
After the consumer responds with a StartFramedProtocolResponse
extended operation, the supplier sends a stream of
LBURPOperationRequest extended operations to the consumer. This
stream MAY be sent asynchronously to maximize the efficiency of the
transfer. Except in certain circumstances allowed by the protocol to
deal with linear and circular dependency issues, the consumer
processes each LBURPOperationRequest in the order it was sent by the
supplier by applying the LDAP v3 update operations contained within
it to the DIT. (The sequence number in each request is utilized to
ensure that proper ordering between LBURPOperationRequests is
maintained even when the requests are sent asynchronously.) As each
LBURPOperationRequest is completed, the consumer sends a
LBURPOperationResponse to the supplier indicating the success or
failure of the operation.
4.3. Update Termination
When the supplier has sent all LBURPOperationRequests, it sends an
EndFramedProtocolRequest extended operation to the consumer to
terminate the update stream. The consumer responds with an
EndFramedProtocolResponse extended operation, and the update is
complete.
4.4. Update Styles
Two styles of update--full and incremental--are defined.
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 3
LDAP Bulk Update/Replication Protocol March, 2000
Full update creates a completely new set of entries in the target
replica; any existing entries in that replica at the start of the
StartFramedProtocolRequest operation are removed before the LDAP
requests in the replication stream are processed. The only LDAP
operation allowed in a full update stream is add. After a server
receives and acknowledges a StartFramedProtocolRequest for the
LBURPFullUpdateProtocol, the LDAP server MAY choose to not service
LDAP requests other than those contained in the update stream for
the replica which is being initialized until that update stream is
completely processed.
Incremental update performs a series of incremental changes to the
replica; existing entries in the replica are only affected if
explicitly modified in some way by the update operations contained
in the update stream. All update operations defined in [LDAPv3]--
add, modify, delete, and moddn--are allowed in the incremental
update stream. When a server is processing an incremental update
stream, the replica that is being modified MAY choose to not service
LDAP requests other than those contained in the update stream until
that update stream is completely processed.
4.5. Applicability of Protocol
No attempt is made to deal with the issues associated with multiple-
master replicas or to maintain state information such as
modification times of entries or attribute values in such a way that
updates to the same entry on multiple master replicas can be
correctly ordered. For this reason convergence of data between all
replicas can only be assured in a single-master replication
environment.
5. High-level Description of Protocol Flow
The following section provides a high-level overview of the
replication protocol. Throughout this section, the client or server
acting as supplier is indicated by the letter "S", and the server
acting as consumer is indicated by the letter "C". The construct "S
-> C" indicates that the supplier is sending an LDAPv3 operation to
the consumer, and "C -> S" indicates that the consumer is sending an
LDAPv3 operation to the supplier.
S -> C: LDAP bind operation (identity and credentials
used are implementation-defined)
C -> S: Bind response
S -> C: StartFramedProtocolRequest LDAPv3 extended
operation. The parameters are:
1) OID of LBURP incremental or full update
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 4
LDAP Bulk Update/Replication Protocol March, 2000
replication protocol as defined in this
document.
C -> S: StartFramedProtocolResponse LDAPv3 extended operation.
The parameters are:
1) A suggested transactionSize (see section 6.2.1)
S -> C: The supplier may send zero or more
LBURPOperationRequest LDAPv3 extended operations.
The requests MAY be sent asynchronously. The
parameters are:
1) A sequence number which specifies the order of
the operation with respect to other operations
in the replication stream.
2) A list of one or more LDAP v3 update operations.
C -> S: The consumer processes each of the LDAP v3 update
operations contained within an LBURPOperationRequest.
If it was able to successfully complete all of the
update operations in the request, the consumer sends
an LBURPOperationResponse with a result code of
success. If one or more of the LDAP v3 update
operations was not completed successfully, the
consumer sends an LBURPOperationResponse with a non-
success result code and includes a sequence of
LDAPResult elements for each of the failed update
operations which indicate the reason for failure.
S -> C: After all required updates have been sent to the
consumer, the supplier sends an
EndFramedProtocolRequest LDAPv3 extended
operation. The parameters are:
1) A sequence number which is one greater than the
sequence number of the last operation in the
replication stream.
C -> S: The consumer responds by sending an
EndFramedProtocolResponse LDAPv3 extended operation.
6. Elements of Protocol
The LDAP Bulk Update/Replication protocol works within the framework
of the Replication Update Protocol [LDUP RUP]. Unless otherwise
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 5
LDAP Bulk Update/Replication Protocol March, 2000
stated, those elements of protocol taken from the Replication Update
Protocol framework are to be used precisely as described there.
6.1. StartFramedProtocolRequest Extended Operation
Section 4.1 of [FRAMING] defines the StartFramedProtocolRequest
extended operation in terms of the [LDAPv3] ExtendedRequest as
follows:
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
requestName [0] LDAPOID,
requestValue [1] OCTET STRING OPTIONAL
}
The requestName portion of the StartFramedProtocolRequest must be
the OID "2.16.840.1.113719.1.142.100.1".
The requestValue of the StartFramedProtocolRequest must be set to
the BER-encoding of the following:
StartFramedProtocolRequestValue ::= SEQUENCE {
framedProtocolOID LDAPOID,
framedProtocolPayload OPTIONAL OCTET STRING
}
6.1.1. framedProtocolOID
The framedProtocolOID is an OID that uniquely identifies the
protocol framed by this operation.
The framedProtocolOID for the LBURP Incremental Update Protocol is
2.16.840.1.113719.1.142.1.4.1. The framedProtocolOID for the LBURP
Full Update Protocol is 2.16.840.1.113719.1.142.1.4.2.
6.1.2. framedProtocolPayload
The framedProtocolPayload is an octet string that contains protocol-
specific information.
For LBURP, there is no framedProtocolPayload element for the
StartFramedProtocolRequest extended operation.
6.2. StartFramedProtocolResponse
Section 4.2 of [FRAMING] defines the StartFramedProtocolResponse
extended operation in terms of the [LDAPv3] ExtendedResponse as
follows:
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
COMPONENTS of LDAPResult,
responseName [10] LDAPOID OPTIONAL,
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 6
LDAP Bulk Update/Replication Protocol March, 2000
response [11] OCTET STRING OPTIONAL
}
The responseName of the StartFramedProtocolResponse must be the OID
"2.16.840.1.113719.1.142.100.2".
For LBURP, the response of a StartFramedProtocolResponse must be set
to the BER-encoding of the following:
LBURPStartFramedProtocolResponse ::= SEQUENCE {
transactionSize INTEGER,
}
6.2.1 transactionSize
The transactionSize is sent by the consumer to tell the supplier the
number of update operations per UpdateOperationList (see section
6.3.2) that it would like the supplier to send.
6.3. LBURPOperationRequest
The LBURPOperationRequest extended operation is used to send a set
of one or more LDAP v3 update operations from the supplier to the
consumer along with sequencing information that enables the consumer
to maintain the proper sequencing of among multiple asynchronous
requests.
An LDAPv3 Extended Request is defined in [LDAPv3] as follows:
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
requestName [0] LDAPOID,
requestValue [1] OCTET STRING OPTIONAL
}
The responseName of the LBURPOperationRequest must be the OID
"2.16.840.1.113719.1.142.100.6".
The requestValue of an LBURPOperationRequest extended operation must
be set the BER-encoding of the following:
LBURPOperationRequestValue ::= SEQUENCE {
sequenceNumber INTEGER (1 .. maxInt),
updateOperationList UpdateOperationList
}
6.3.1. sequenceNumber
The sequenceNumber is used to specify the ordering of
LBURPOperationRequests. This enables the consumer to know the order
in which LBURPOperationRequests must be processed even if it
receives them in a sequence different from that in which they were
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 7
LDAP Bulk Update/Replication Protocol March, 2000
sent from the supplier. The supplier MUST set the value of
sequenceNumber of the first LBURPOperationRequest to 1, and MUST
increment the value of sequenceNumber for each succeeding
LBURPOperationRequest.
6.3.2. UpdateOperationList
The OpList is a list of one or more standard LDAP update requests
and is defined as follows:
UpdateOperationList ::= SEQUENCE of CHOICE {
addRequest AddRequest,
modifyRequest ModifyRequest,
delRequest DelRequest,
modDNRequest ModifyDNRequest,
}
AddRequest, ModifyRequest, DelRequest, and ModifyDNRequest are
standard LDAP update requests as defined in sections 4.6, 4.7, 4.8,
and 4.9 of [LDAPv3].
For the LBURP Incremental Update Protocol, all of the choices listed
in OpList are valid and can be freely intermixed within an LBURP
Incremental Update Protocol replication stream
For the LBURP Full Update Protocol, the only valid choice is
addRequest. Clients MUST not include any other choice in
LBURPOperationRequests sent as part of an LBURP Full Update Protocol
replication stream.
6.4. LBURPOperationResponse
An LDAPv3 Extended Response is defined in [LDAPv3] as follows:
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
COMPONENTS of LDAPResult,
responseName [10] LDAPOID OPTIONAL,
response [11] OCTET STRING OPTIONAL
}
The responseName of the LBURPOperationResponse must be the OID
"2.16.840.1.113719.1.142.100.7".
The response of an LBURPOperationRequest extended operation must be
set the BER-encoding of the following:
LBURPOperationResponseValue ::= SEQUENCE of OperationResult
OperationResult ::= SEQUENCE {
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 8
LDAP Bulk Update/Replication Protocol March, 2000
operationNumber INTEGER,
ldapResult LDAPResult
}
If all of the update operations contained in the
LBURPOperationRequest are successfully processed, the resultCode of
the LBURPOperationResponse is set to success and no
LBURPOperationResponseValue is included in the
LBURPOperationResponse.
If any of the update operations contained in the
LBURPOperationRequest fails, an LBURPOperationResponseValue is
included in the LBURPOperationResponse. For each update operation
that fails, an OperationResult is included in the
LBURPOperationResponseValue.
6.4.1. operationNumber
The operationNumber identifies the operation that failed. Operations
are numbered beginning at 1.
6.4.2 ldapResult
The ldapResult included in the OperationResult is the same ldapResult
that would be sent for the update operation that failed if it had
failed while being processed as a normal LDAP v3 update operation.
6.5. EndFramedProtocolRequest
Section 4.3 of [FRAMING] defines the EndFramedProtocolRequest
extended operation in terms of the [LDAPv3] ExtendedRequest as
follows:
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
requestName [0] LDAPOID,
requestValue [1] OCTET STRING OPTIONAL
}
The requestName of the EndFramedProtocolRequest must be the OID
"2.16.840.1.113719.1.142.100.4".
For LBURP, the requestValue of the EndFramedProtocolRequest must be
set to the BER-encoding of the following:
LBURPEndFramedProtocolRequestValue::= SEQUENCE {
sequenceNumber INTEGER (1 .. maxInt)
}
6.5.1. sequenceNumber
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 9
LDAP Bulk Update/Replication Protocol March, 2000
The value in sequenceNumber is one greater than the last
LBURPOperationRequest sequence number in the replication stream. It
allows the server to know when it has received all outstanding
asynchronous LBURPOperationRequests.
6.6. EndFramedProtcolResponse
Section 4.4 of [FRAMING] defines the EndFramedProtocolResponse
extended operation in terms of the [LDAPv3] ExtendedResponse as
follows:
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
COMPONENTS of LDAPResult,
responseName [10] LDAPOID OPTIONAL,
response [11] OCTET STRING OPTIONAL
}
The responseName of the EndFramedProtocolResponse must be the OID
"2.16.840.1.113719.1.142.100.5".
For LBURP, there is no response element for the
EndFramedProtocolResponse extended operation.
7. Semantics of Full and Incremental Update Protocols
7.1. Semantics Common to Both Full and Incremental Update Protocols
Since both the full and incremental update protocols use sequences
of standard LDAP v3 operations to transmit update information, no
attempt is made by the protocol to include the information needed to
support full multi-master replication as defined by [LDUP RUP].
Although entries and their associated attributes and attribute
values can be synchronized using this protocol, no CSNs are included
in the update stream; updates made using this replication protocol
are treated the same as other LDAP operations wherein they are
deemed to occur at the present. Operational attributes such as
modifiersTimeStamp MAY be included in the replication stream, and if
they are, they SHOULD be put into the entry.
The LBURPOperationRequests that form the replication stream MAY be
sent asynchronously by the supplier to the consumer. This means that
the supplier need not wait for a LBURPOperationResponse from one
LBURPOperationRequest before sending the next.
The LBURPOperationRequests in the replication stream, plus the
initial state of entries in the consumer replica in the case of
incremental update, collectively represent the desired final state
of the consumer replica. The consumer server may take any action
required to efficiently achieve this desired final state of the
replica. Examples of such actions include reordering LDAP requests
to ensure that linear dependencies within the replication stream are
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 10
LDAP Bulk Update/Replication Protocol March, 2000
correctly ordered, breaking an LDAP modification request into two or
more separate modification requests to adequately resolve a circular
dependency within the replication stream, and aggregating LDAP
update operations to process them more efficiently. When taking
actions of this sort, the server MUST NOT reorder LDAP requests in
such a way that the desired final state is different from that which
would have been achieved before the action was taken.
While a consumer server is processing a an LBURP update stream, the
it MAY choose to not service LDAP requests for the replica involved
in the replication operation other than those contained in the
replication stream including LDAP requests on other connections.
This requirement is designed to allow implementers the freedom to
implement highly-efficient methods of handling the replication
stream without being constrained by the need to maintain a live,
working DIT database while doing so.
7.2. Semantics of the Full Replication Protocol
Full replication creates a completely new set of entries in that
replica; any existing entries in that replica at the start of the
replication operation are removed before the LDAP requests in the
replication stream are processed.
The only LDAP operation allowed in a full update stream is add.
Clients MUST NOT send any other type of update operation in the full
update stream. If any other LDAP operation is received as part of
the update stream, the server MUST return unwillingToPerform as the
response for the operation.
If the full update sequence fails for some reason (e.g. a connection
is abruptly broken in the middle of an otherwise-successful update
sequence) the server MUST remove any entries created during the
update sequence, thereby leaving the replica in a known state.
7.3. Semantics of the Incremental Replication Protocol
Incremental replication performs a series of incremental changes to
the replica; existing entries in the replica are only affected if
explicitly modified in some way by the update operations contained
in the replication stream.
All LDAP v3 update operations--add, modify, delete, and moddn--are
allowed in the incremental replication stream. If a non-update
operation is received as part of the replication stream, the server
MUST return unwillingToPerform as the response for the operation.
8. Notes To Implementers
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 11
LDAP Bulk Update/Replication Protocol March, 2000
It is RECOMMENDED that, if possible, the consumer LDAP server refer
non-replication requests for the replica being updated to another
server containing that replica during the time that consumer LDAP
server has the replica off-line for replication.
Implementations MAY choose to perform the operations in the
replication stream with special permissions to improve performance.
9. Security Considerations
Implementations should ensure that a supplier making a Bulk
Update/Replication request is bound with appropriate permissions.
There is a potential for loss of data, especially with the full
update protocol, which removes all entries in a replica as part of
its operation. Second, forcing the removal of all entries in a
replica may consume large amounts of server resources. Third, unlike
other replication protocols, no existing replication agreement
between supplier and consumer is required. These risks increase if
the consumer server also processes the replication stream with
special permissions to improve performance. For these reasons,
implementers should carefully consider which identities or
permissions are required to perform Bulk Update/Replication Protocol
operations and take steps to ensure that only connections bound with
appropriate permissions are allowed to perform them.
The data contained in the replication stream may contain passwords
and other sensitive data. Care should be taken to properly
safeguard this information while in transit between supplier and
consumer.
10. Document Revision History
10.1. draft-rharrison-lburp-00.txt
Initial Draft
10.2. draft-rharrison-lburp-01.txt
Adjusted LBURP protocol to use extended requests for all operations.
LDAP update operations are now encapsulated within the LBURP
Operation Request for two reasons: (1) To allow the inclusion of
operation ordering information. This allows LDAP servers to maintain
the proper ordering of updates even in cases where multi-threaded
stacks present update operations to the server out-of-sequence. (2)
To allow multiple update operations to be sent from client to server
in a single request. This was a natural evolution of the changes
made for (1) and allows the protocol to make more efficient use of
network bandwidth,
Converted references to LDUP extended operations to use a new LDAP
Framed Operations Protocol.
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 12
LDAP Bulk Update/Replication Protocol March, 2000
Specified OIDs used for the protocol and extended operations.
Changed requirement that a server "MUST NOT" service non-LBURP
requests during a full update to a "MAY choose to not" service non-
LBURP requests during a full update. This gives implementers the
option to do what is needed without imposing a requirement that may
not be needed by some implementations.
11. References
[FRAMING]
Stokes, Ellen, and Gordon Good, ôExtended Operations for
Framing LDAP Operationsö, UNPUBLISHED INTERNET-DRAFT: ldup-
framing.txt.
[LDAPv3]
Wahl, M., Howes, T., and S. Kille, "Lightweight Directory
Access Protocol (v3)", RFC 2251, December 1997.
[LDIF]
Gordon Good, "LDAP Data Interchange Format (LDIF)", INTERNET-
DRAFT: draft-good-ldap-ldif-04.txt, 22 June 1999.
[ReqsKeywords]
Scott Bradner. "Key Words for use in RFCs to Indicate
Requirement Levels". RFC 2119.
12. Author's Addresses
Roger Harrison
Novell, Inc.
122 E. 1700 S.
Provo, UT 84606
+1 801 861 2642
roger_harrison@novell.com
Jim Sermersheim
Novell, Inc.
122 E. 1700 S.
Provo, UT 84606
+1 801 861 3088
jimse@novell.com
Full Copyright Statement
"Copyright (C) The Internet Society (date). All Rights Reserved.
This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it
or assist in its implmentation may be prepared, copied, published
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 13
LDAP Bulk Update/Replication Protocol March, 2000
and distributed, in whole or in part, without restriction of any
kind, provided that the above copyright notice and this paragraph
are included on all such copies and derivative works. However, this
document itself may not be modified in any way, such as by removing
the copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the purpose of
developing Internet standards in which case the procedures for
copyrights defined in the Internet Standards process must be
followed, or as required to translate it into languages other than
English.
The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS 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.
Individual Submission - Expires September 10, 2000
Harrison & Sermersheim 14
Html markup produced by rfcmarkup 1.129d, available from
https://tools.ietf.org/tools/rfcmarkup/