<?xml version="1.0"?>
<!DOCTYPE rfc SYSTEM "http://mappa.mundi.net/features/mtr/rfc2629.dtd">

<?rfc compact="no"?>
<?rfc toc="yes"?>
<?rfc header="Draft Memo"?>

<rfc>
<front>
<title abbrev=" ">On the Design of Application Protocols</title>


<author initials="M.T." surname="Rose" fullname="Marshall T. Rose">
<organization>Invisible Worlds, Inc.</organization>

<address>
<postal>
<street>1179 North McDowell Boulevard</street>
<city>Petaluma</city> <region>CA</region> <code>94954-6559</code>
<country>US</country>
</postal>

<phone>+1 707 789 3700</phone>
<email>mrose@invisible.net</email>
<uri>http://invisible.net/</uri>
</address>
</author>


<date month="February" year="2000"/>
</front>

<middle>
<section title="A Problem 19 Years in the Making">
<t><xref target="RFC0821">SMTP</xref> is close to being the perfect application protocol: it
solves a large, important problem in a minimalist way. It's simple
enough for an entry-level implementation to fit on one or two
screens of code, and flexible enough to form the basis of very
powerful product offerings in a robust and competitive market.
Modulo a few oddities (e.g., SAML), the design is well conceived and
the resulting specification is well-written and largely
self-contained. There is very little about good application protocol
design that you can't learn by reading the SMTP specification.</t>

<t>Unfortunately, there's one little problem: SMTP was originally
published in 1981 and since that time, a lot of application
protocols have been designed for the Internet, but there hasn't been
a lot of reuse going on. You might expect this if the application
protocols were all radically different, but this isn't the case:
most are surprisingly similar in their functional behavior, even
though the actual details vary considerably.</t>

<t>In late 1998, as Carl Malamud and I were sitting down to review the
<xref target="BXXA">Blocks architecture</xref>,
we realized that we needed to have a protocol for
exchanging Blocks. The conventional wisdom is that when you need an
application protocol, there are three ways to proceed:
<list style="numbers">
<t>find an existing exchange protocol that (more or less) does what
you want;</t>

<t>define an exchange model on top of the world-wide web
infrastructure that (more or less) does what you want; or,</t>

<t>define a new protocol from scratch that does exactly what you
want.</t>
</list>
An engineer can make reasoned arguments about the merits of each of
the three approaches. Here's the process we followed...</t>

<t>The most appealing option is to find an existing protocol and use
that. (In other words, we'd rather "buy" than "make".) So, we did a
survey of many existing application protocols and found that none of
them were a good match for the semantics of the protocol we needed.</t>

<t>For example, most application protocols are oriented toward
client-server behavior, and emphasize the client pulling data from
the server; in contrast with Blocks, a client usually pulls data
from the server, but it also may request the server to
asynchronously push (new) data to it. Clearly, we could mutate a
protocol such as <xref target="RFC0959">FTP</xref>
or SMTP into what we wanted, but by the time
we did all that, the base protocol and our protocol would have more
differences than similarities. In other words, the cost of modifying
an off-the-shelf implementation becomes comparable with starting
from scratch.</t>

<t>Another approach is to use <xref target="RFC1945">HTTP</xref> as the exchange protocol and
define the rules for data exchange over that. For example,
the <xref target="RFC2565">IPP</xref> (the Internet Printing Protocol) uses this approach. The
basic idea is that HTTP defines the rules for exchanging data and
then you define the data's syntax and semantics. Because you inherit
the entire HTTP infrastructure (e.g., HTTP's authentication
mechanisms, caching proxies, and so on), there's less for you to
have to invent (and code!). Or, conversely, you might view the HTTP
infrastructure as too helpful. As an added bonus, if you decide that
your protocol runs over port 80, you may be able to sneak your
traffic past older firewalls, at the cost of port 80 saturation.</t>

<t>HTTP has a lot of strengths, for example, it uses <xref target="RFC2045">MIME</xref> for
encoding data and is ubiquitously implemented. Unfortunately for us,
even with <xref target="RFC2616">HTTP 1.1</xref>,
there still wasn't a good fit. As a
consequence of the highly-desirable goal of maintaining compatibility
with the original HTTP, HTTP's framing mechanism isn't flexible
enough to support server-side asynchronous behavior and its
authentication model isn't similar to other Internet applications.
In addition, we weren't of a mind to play games with port 80.</t>

<t>So, this left us the final alternative: defining a protocol from
scratch. However, we figured that our requirements, while a little
more stringent than most, could fit inside a framework suitable for
a large number of future application protocols. The trick is to
avoid the kitchen-sink approach.
(<eref target="mailto:ddc@lcs.mit.edu">Dave Clark</eref> has a saying: "One
of the roles of architecture is to tell you what you can't do.")</t>
</section>

<section title="You can Solve Any Problem...">
<t>...if you're willing to make the problem small enough.</t>

<t>Our most important step is to limit the problem to application
protocols that exhibit certain features:
<list style="symbols">
<t>they are connection-oriented;</t>

<t>they use requests and responses to exchange messages; and,</t>

<t>they allow for asynchronous message exchange.</t>
</list>
Let's look at each,
in turn.</t>

<t>First, we're only going to consider connection-oriented application
   protocols (those that work on top of <xref target="RFC0793">TCP</xref>).
Another branch in the
taxonomy, connectionless, are those that don't want the delay or
overhead of establishing and maintaining a reliable stream. For
example, most <xref target="RFC1034">DNS</xref> traffic is characterized by a single request
and response, both of which  fit within a single IP datagram. In this
case, it makes sense to implement a basic reliability service above
the transport layer in the application protocol itself.</t>

<t>Second, we're only going to consider message-oriented application
protocols. A "message"
&#151; in our lexicon &#151;
is simply structured
data exchanged between loosely-coupled systems. Another branch in
the taxonomy, tightly-coupled systems, uses remote procedure calls
as the exchange paradigm. Unlike the
connection-oriented/connectionless dichotomy, the issue of loosely-
or tightly-coupled systems is similar to a continuous spectrum.
Fortunately, the edges are fairly sharp.</t>

<t>For example,
<xref target="RFC1094">NFS</xref> is a tightly-coupled system using RPCs. When
   running in a properly-configured LAN, a remote disk accessible via
   NFS is virtually indistinguishable from a local disk. To achieve
   this, tightly-coupled systems are highly concerned with issues of
   latency. Hence, most (but not all) tightly-coupled systems use
   connection-less RPC mechanisms; further, most tend to be implemented
   as operating system functions rather than user-level programs. (In
   some environments, the tightly-coupled systems are implemented as
   single-purpose servers, on hardware specifically optimized for that
   one function.)</t>

<t>Finally, we're going to consider the needs of application protocols
   that exchange messages asynchronously. The classic client-server
   model is that the client sends a request and the server sends a
   response. If you think of requests as "questions" and responses as
   "answers", then the server answers only those questions that it's
   asked and it never asks any questions of its own. We'll need to
   support a more general model, peer-to-peer. In this model, for a
   given transaction one peer might be the "client" and the other the
   "server", but for the next transaction, the two peers might switch
   roles.</t>

<t>It turns out that the client-server model is a proper subset of the
   peer-to-peer model: it's acceptable for a particular application
   protocol to dictate that the peer that establishes the connection
   always acts as the client (initiates requests), and that the peer
   that listens for incoming connections always acts as the server
   (issuing responses to requests).</t>

<t>There are quite a few existing application domains that don't fit
   our requirements, e.g., nameservice (via the DNS), fileservice (via
   NFS), multicast-enabled applications such as distributed video
   conferencing, and so on. However, there are a lot of application
   domains that do fit these requirements, e.g., electronic mail, file
   transfer, remote shell, and the world-wide web. So, the bet we are
   placing in going forward is that there will continue to be reasons
   for defining protocols that fit within our framework.</t>
</section>

<section title="Protocol Mechanisms">
<t>The next step is to look at the tasks that an application protocol
  must perform and how it goes about performing them. Although an
   exhaustive exposition might identify a dozen (or so) areas, the ones
   we're interested in are:
<list style="symbols">
<t>framing, which tells how the beginning and ending of each message
      is delimited;</t>

<t>encoding, which tells how a message is represented when exchanged;</t>

<t>error reporting, which tells how errors are described;</t>

<t>multiplexing, which tells how independent parallel exchanges are
      handled;</t>

<t>user authentication, which tells how the peers at each end of the
      connection are identified and verified; and,</t>

<t>transport security, which tells how the exchanges are protected
      against third-party interception or modification.</t>
</list>
A notable absence in this list is naming &#151;
we'll explain why later on.</t>

<section title="Framing">
<t>There are three commonly used approaches to delimiting messages:
   octet-stuffing, octet-counting, and connection-blasting.</t>

<t>An example of a protocol that uses octet-stuffing is SMTP. Commands
   in SMTP are line-oriented (each command ends in a CR-LF pair). When
   an SMTP peer sends a message, it first transmits the "DATA" command,
   then it transmits the message, then it transmits a "." (dot)
   followed by a CR-LF. If the message contains any lines that begin
   with a dot, the sending SMTP peer sends two dots; similarly, when
   the other SMTP peer receives a line that begins with a dot, it
   discards the dot, and, if the line is empty, then it knows it's
   received the entire message. Octet-stuffing has the property that
   you don't need the entire message in front of you before
   you start sending it. Unfortunately, it's slow because both the sender
   and receiver must scan each line of the message to see if they
   need to transform it.</t>

<t>An example of a protocol that uses octet-counting is HTTP. Commands
   in HTTP consist of a request line followed by headers and a body.
   The headers contain an octet count indicating how large the body is.
   The properties of octet-counting are the inverse of octet-stuffing:
before you can start sending a message you need to know the length
   of the whole message, but you don't need to look at the content of
   the message once you start sending or receiving.</t>

<t>An example of a protocol that uses connection-blasting is FTP.
   Commands in FTP are line-oriented, and when it's time to exchange a
   message, a new TCP connection is established to transmit the
   message. Both octet-counting and connection-blasting have the
   property that the messages can be arbitrary binary data; however,
   the drawback of the connection-blasting approach is that the peers
   need to communicate IP addresses and TCP port numbers, which may be
   "transparently" altered by <xref target="RFC2663">NATS</xref> and network bugs. In addition,
   if the messages being exchanged are small (say less than 32k), then
   the overhead of establishing a connection for each message
   contributes significant latency during data exchange.</t>
</section>

<section title="Encoding">
<t>There are many schemes used for encoding data (and many more
   encoding schemes have been proposed than are actually in use). Fortunately,
    only a few are burning brightly on the radar.</t>

<t>The messages exchanged using SMTP are encoded using the <xref target="RFC0822">822-style</xref>.
The 822-style divides a message into textual headers
   and an unstructured body. Each header consists of a name and a value
   and is terminated with a CR-LF pair. An additional CR-LF separates
   the headers from the body.</t>

<t>It is this structure that HTTP uses to indicate the length of the
   body for framing purposes. More formally, HTTP uses MIME, an
   application of the 822-style to encode both the data itself (the
   body) and information about the data (the headers). That is,
   although HTTP is commonly viewed as a retrieval mechanism for
<xref target="RFC1866">HTML</xref>,
it is really a retrieval mechanism for objects encoded
   using MIME, most of which are either HTML pages or referenced
   objects such as GIFs.</t>
</section>

<section title="Error Reporting">
<t>An application protocol needs a mechanism for conveying error
   information between peers. The first formal method for doing this
   was defined by SMTP's "theory of reply codes". The basic idea is
   that an error is identified by a three-digit string, with each
   position having a different significance:
<list style="hanging">
<t hangText="the first digit:">indicating success or failure, either permanent or
      transient;</t>

<t hangText="the second digit:">indicating the part of the system reporting the situation (e.g., the syntax analyzer); and,</t>

<t hangText="the third digit:">identifying the actual situation.</t>
</list>
 Operational experience with SMTP suggests that the range of error
   conditions is larger than can be comfortably encoded using a
   three-digit string (i.e., you can report on only 10 different things
   going wrong for any given part of the system). So,
<xref target="RFC2034" /> provides a
   convenient mechanism for extending the number of values that can
   occur in the second and third positions.</t>

<t>Virtually all of the application protocols we've discussed thus far
   use the three-digit reply codes, although there is less coordination
   between the designers of different application protocols than most
   would care to admit.</t>

<t>Finally, in addition to conveying a reply code, most protocols also
   send a textual diagnostic suitable for human, not machine,
   consumption. (More accurately, the textual diagnostic is suitable
   for people who can read a widely-used variant of the English
   language.) Since reply codes reflect both positive and negative
   outcomes, there have been some innovative uses made for the text
   accompanying positive responses, e.g., <eref target="http://mappa.mundi.net/cartography/Wheel/">prayer wheels</eref>.</t>
</section>

<section title="Multiplexing">
<t>Few application protocols today allow independent parallel exchanges
   over the same connection. In fact, the more widely-implemented
   approach is to allow pipelining, e.g., <xref target="RFC2197">command pipelining</xref> in
   SMTP or persistent connections in HTTP 1.1. Pipelining allows a
   client to make multiple requests of a server, but requires the
   requests to be processed serially. (Note that a protocol needs to
   explicitly provide support for pipelining, since, without explicit
   guidance, many implementors produce systems that don't handle
   pipelining properly; typically, an error in a request causes
   subsequent requests in the pipeline to be discarded).</t>

<t>Pipelining is a powerful method for reducing network latency. For
   example, without persistent connections, HTTP's framing mechanism is
   really closer to connection-blasting than octet-counting, and it
   enjoys the same latency and efficiency problems.</t>

<t>In addition to reducing network latency (the pipelining effect),
   parallelism also reduces server latency by allowing multiple requests
   to be processed by multi-threaded implementations. Note that if you
   allow any form of asynchronous exchange, then support for
   parallelism is also required, because exchanges aren't necessarily
   occurring under the synchronous direction of a single peer.</t>

<t>Unfortunately, when you allow parallelism, you also need a flow
   control mechanism to avoid starvation and deadlock. Otherwise, a
   single set of exchanges can monopolize the bandwidth provided by the
   transport layer. Further, if the peer is resource-starved, then it
   may not have enough buffers to receive a message and deadlock
   results.</t>

<t>The flow control mechanism used by TCP is based on sequence numbers
   and a sliding window: each receiver manages a sliding window that
   indicates the number of data octets that may be transmitted before
   receiving further permission. However, it's now time for the third
   shoe of multiplexing to drop: segmentation. If you do flow control
   then you also need a segmentation mechanism to fragment messages
   into smaller pieces before sending and then re-assemble them as
   they're received.</t>

<t>All three of the multiplexing issues: parallelism, flow control, and
   segmentation have an impact on how the protocol does framing. Before
   we defined framing as "how to tell the beginning and end of each
   message" &#151; in addition, we need to be able to identify independent
   messages, send messages only when flow control allows us to, and
   segment them if they're larger than the available window (or too
   large for comfort).</t>
</section>

<section title="User Authentication">
<t>Perhaps for historical (or hysterical) reasons, most application
   protocols don't do authentication. That is, they don't authenticate
   the identity of the peers on the connection or the authenticity of
   the messages being exchanged. Or, if authentication is done, it is
   domain-specific for each protocol. For example, FTP and HTTP use
   entirely different models and mechanisms for authenticating the
   initiator of a connection. (Independent of mainstream HTTP, there is
   a little-used <xref target="RFC2660">variant</xref> that authenticates the messages it
   exchanges.)</t>

<t>A few years ago,
<xref target="RFC2222">SASL</xref>
(the Simple Authentication and Security
   Layer) was developed to provide a framework for authenticating
   protocol peers. SASL let's you describe how an authentication
   mechanism works, e.g., an <xref target="RFC2444">OTP</xref> (One-Time Password) exchange.
It's then up to each protocol designer to specify how SASL exchanges are
   conveyed by the protocol. For example,
<xref target="RFC2554" /> explains how SASL works with SMTP.</t>

<t>A notable exception to the SASL bandwagon is HTTP, which defines
   its own
<xref target="RFC2617">authentication mechanisms</xref>.There is little reason why
   SASL couldn't be introduced to HTTP, although to avoid
   race-conditions with the use of OTP, the persistent connection
   mechanism of HTTP 1.1 must be used.</t>

<t>SASL has an interesting feature in that in addition to explicit
   protocol exchanges to authenticate identity, it can also use
   implicit information provided from the layer below. For example, if
   the connection is running over <xref target="RFC2401">IPsec</xref>,
then the credentials of
   each peer are known and verified when the TCP connection is
   established.</t>
</section>

<section title="Transport Security">
<t>HTTP is the first widely used protocol to make use of transport
   security to encrypt the data sent on the connection. The current
   version of this mechanism,
<xref target="RFC2246">TLS</xref>,
is also available for SMTP and
   other application protocols such as
<xref target="RFC2244">ACAP</xref>
(the Application Configuration Access Protocol).</t>

<t>The key difference between the original mechanism and TLS, is one of
   provisioning. In the initial approach, a world-wide web server would
   listen on two ports, one for plaintext traffic and the other for
   secured traffic; in contrast, a server implementing an application
   protocol that is TLS-enabled listens on a single port for plaintext
   traffic; once a connection is established, the use of TLS is
   negotiated by the peers.</t>
</section>

<section title="Let's Recap">
<figure>
<preamble>Let's briefly compare the properties of the three main
   connection-oriented application protocols in use today:</preamble>
<artwork>
                  Mechanism  SMTP        FTP        HTTP
        -------------------  ----------  ---------  -------------
                    Framing  Stuffing    Blasting   Counting

                   Encoding  822         Binary     MIME

            Error Reporting  3-digit     3-digit    3-digit

               Multiplexing  pipelining  no         pipelining

        User Authentication  SASL        user/pass  user/pass

         Transport Security  TLS         no         TLS (nee SSL)
</artwork>
<postamble>Note that the username/password mechanisms used by FTP and HTTP are
   entirely different with one exception: both can be termed a
   "username/password" mechanism.</postamble>
</figure>

<t>These three choices are broadly representative: as more protocols
   are considered, the patterns are reinforced. For example,
<xref target="RFC1939">POP</xref> uses octet-stuffing,
but <xref target="RFC1731">IMAP</xref> uses octet-counting,
and so on.</t>
</section>
</section>

<section title="Protocol Properties">
<t>When we design an application protocol, there are a few properties
   that we should keep an eye on.</t>

<section title="Scalability">
<t>A well-designed protocol scales well when deployed.</t>

<t>Because few application protocols support multiplexing, a common
   trick is for a program to open multiple simultaneous connections to
   a single destination. The theory is that this reduces latency and
   increases throughput. The reality is that both the transport layer
   and the server view each connection as an independent instance of the
   application protocol, and this causes problems.</t>

<t>In terms of the transport layer, TCP uses adaptive algorithms to
   efficiently transmit data as networks conditions change. But what
   TCP learns is limited to each connection. So, if you have multiple
   TCP connections, you have to go through the same learning process
   multiple times -- even if you're going to the same host. Not only
   does this introduce unnecessary traffic spikes into the
   network, because TCP uses a slow-start algorithm when establishing a
   connection, the program still sees additional latency. To deal with
   the fact that a lack of multiplexing in application protocols causes
   implementors to make sloppy use of the transport layer, network
   protocols are now provisioned with increasing sophistication, e.g., <xref target="RFC2309">RED</xref>.</t>

<t>In terms of the server, each incoming connection must be dispatched
   and (probably) authenticated against the same resources.
   Consequently, server overhead increases based on the number of
   connections established, rather than the number of remote users. The
   same issues of fairness arise: it's much harder for servers to
   allocate resources on a per-user basis, when a user can cause an
   arbitrary number of connections to pound on the server.</t>

<t>Another important aspect of scalability is to consider the
   relative numbers of clients and servers. (This is true even in the
   peer-to-peer model, where a peer can act both in the client and
   server role.) Typically, there are many more client peers than
   server peers. In this case, functional requirements should be
   shifted from the servers onto the clients. The reason is that a
   server is likely to be interacting with multiple clients and this
   functional shift makes it easier to scale.</t>
</section>

<section title="Efficiency">
<t>A well-designed protocol is efficient.</t>

<t>For example, although a compelling argument can be made than
   octet-stuffing leads to more elegant implementations than
   octet-counting, experience shows that octet-counting consumes far
   fewer cycles.</t>

<t>Regrettably, we sometimes have to compromise efficiency in order to
   satisfy other properties. For example, 822 (and MIME) use textual
   headers. We could certainly define a more efficient representation
   for the headers if we were willing to limit the header names and
   values that could be used. In this case, extensibility is viewed as
   more important than efficiency. Of course, if we were designing a
   network protocol instead of an application protocol, then we'd make
   the trade-offs using a razor with a different edge.</t>
</section>

<section title="Simplicity">
<t>A well-designed protocol is simple.</t>

<t>Here's a good rule of thumb: a poorly-designed application protocol
   is one in which it is equally as "challenging" to do something basic as
   it is to do something complex. Easy things should be easy to do and
   hard things should be harder to do. The reason is simple: the pain
   should be equal to the gain.</t>

<t>Another rule of thumb is that if an application protocol has two
   ways of doing the exact same thing, then there's a problem somewhere
   in the architecture underlying the design of the application
   protocol.</t>

<t>Hopefully, simple doesn't mean simple-minded: something
   that's well-designed accommodates everything in the problem domain,
   even the troublesome things at the edges. What makes the design
   simple is that it does this in a consistent fashion. Typically, this
   leads to an elegant design.</t>
</section>

<section title="Extensibility">
<t>A well-designed protocol is extensible.</t>

<t>As clever as application protocol designers are, there are likely to
   be unforeseen problems that the application protocol will be asked
   to solve. So, it's important to provide the hooks that can be used
   to add functionality or customize behavior. This means that the
   protocol is evolutionary, and there must be a way for
   implementations reflecting different steps in the evolutionary path to
   negotiate which extensions will be used.</t>

<t>But, it's important to avoid falling into the extensibility trap:
   the hooks provided should not be targeted at half-baked future
requirements. Above all, the hooks should be simple.</t>

<t>Of course good design goes a long way towards minimizing the need
   for extensibility. For example, although SMTP initially didn't have
   an extension framework, it was only after ten years of experience
   that its excellent design was altered. In contrast, a
   poorly-designed protocol such as <xref target="RFC0854">Telnet</xref>
can't function without
   being built around the notion of extensions.</t>
</section>
</section>

<section title="The BXXP Framework">
<t>Finally, we get to the money shot: here's what we did.</t>

<t>We defined an application protocol framework called BXXP (the Blocks
   eXtensible eXchange Protocol). The reason it's a "framework" instead
   of an application protocol is that we provide all the mechanisms
   discussed earlier without actually specifying the kind of messages
   that get exchanged. So, when someone else needs an application
   protocol that requires connection-oriented, asynchronous
   request-response interactions, they can start with BXXP. It's then
   their responsibility to define the last 10% of the application
   protocol, the part that does, as we say, "the useful work".</t>

<t>So, what does BXXP look like?</t>

<section title="Framing and Encoding">
<t>Framing looks a lot like SMTP or HTTP: there's a command line that
   identifies the beginning of the frame, then there's a MIME object
   (headers and body). Unlike SMTP, BXXP uses octet-counting, but
   unlike HTTP, the command line is where you find the size of the
   payload.</t>

<t>Actually, the command line for BXXP has a lot of information, it
   tells you:
<list style="symbols">
<t>whether this frame contains a request or response;</t>

<t>whether there's more to the message than just what's in this
      frame (a continuation flag);</t>

<t>how to distinguish the message contained in this frame from other
      messages (a serial number);</t>

<t>where the payload occurs in the sliding window (a sequence
      number) and how many octets are in the payload of this frame; and,</t>

<t>which part of the system should get the message (for requests) or
      whether this is a positive or negative response.</t>
</list>
(The command line is textual and ends in a CR-LF pair, and the
   arguments are separated by a space.)</t>

<t>Since you need to know all this stuff to process a frame, we put it
   all in one easy to parse location. You could probably devise a more
   efficient encoding, but the command line is a very small part of the
   frame, so you wouldn't get much bounce from optimizing it. Further,
   because framing is at the heart of BXXP, the frame format has some
   self-consistency checks that catch the majority of programming
   errors.</t>

<t>Another trick is in the headers: because the command line contains
   all the framing information, the headers may contain minimal MIME
   information (such as Content-Type). Usually, however, the headers
   are empty. That's because the BXXP default payload is <xref target="W3C.XML">XML</xref>.
(Actually, a "Content-Type: text/xml" with 8-bit encoding).</t>

<t>We chose XML as the default because it provides a simple mechanism
   for nested, textual representations. (Alas, the 822-style encoding
   doesn't easily support nesting.) By design, XML's nature isn't
   optimized for compact representations. That's okay because we're
   focusing on loosely-coupled systems and besides there are efficient
   XML parsers available.</t>
</section>

<section title="Error Reporting">
<t>We use 3-digit error codes.</t>

<t>In addition, the response message to a request is flagged as either
   positive or negative. This makes it easy to signal success or
   failure and allow the receiving peer some freedom in the amount of
   parsing it wants to do on failure.</t>
</section>

<section title="Multiplexing">
<t>Despite the lessons of SMTP and HTTP, there isn't a lot of field
   experience to rely on when designing the multiplexing features of
   BXXP. Here's what we did: frames are exchanged in the context of a
   "channel". Each channel has an associated "profile" that defines the
   syntax and semantics of the messages exchanged over a channel.</t>

<t>Channels provide both an extensibility mechanism for BXXP and
   the basis for multiplexing. Remember the last parameter in the
   command line of a BXXP frame? The "part of the system" that gets the
   message is identified by a channel number.</t>

<t>A profile is defined according to a "Profile Registration" template.
   The template defines how the profile is identified (using an XML
   DTD), what kind of messages get exchanged during channel creation,
   what kind of messages get sent in requests and responses, along with
   the syntax and semantics of those messages. When you create a
   channel, you identify a profile and provide some arguments. If the
   channel is successfully created, you get back a positive response;
   otherwise, you get back a negative response explaining why.</t>

<t>Perhaps the easiest way to see how channels provide an extensibility
   mechanism is to consider what happens when a connection is established.
   The BXXP peer that accepted the connection sends a
   greeting on channel zero identifying the profiles that it supports.
   (Channel 0 is used for channel management &#151; it's automatically
   created when a connection is opened.) If you want transport
   security, the very first thing you do is to create a channel that
   negotiates transport security, and, once the channel is created, you
   tell it to do its thing. Next, if you want to authenticate, you
   create a channel that performs user authentication, and, once the
   channel is created, you tell it to get busy. At this point, you
   create one or more channels for data exchange. This process is
   called "tuning"; once you've tuned the connection, you start using
   the data exchange channels to do "the useful work".</t>

<t>The first channel that's successfully started has a trick associated
   with it: when you ask to start the channel, you're allowed to
   specify a "service name" that goes with it. This allows a server
   with multiple configurations to select one based on the client's
   suggestion. (A useful analogy is HTTP 1.1's "Host:" header.) If the
   server accepts the "service name", then this configuration is used
   for the rest of the connection.</t>

<t>To allow parallelism, BXXP allows you to use multiple channels
   simultaneously. Each channel processes requests serially, but there
   are no constraints on the processing order for different channels.
   So, in a multi-threaded implementation, each channel maps to its own
   thread.</t>

<t>This is the most general case, of course. For one reason or another,
   an implementor may not be able to support this. So, BXXP allows for
   both positive and negative responses when a request is made. So, If
   you want the classic client-server model, the client program should
   simply reject any requests made by the server. This effectively
   throttles any asynchronous messages from the server.</t>

<t>Of course, we now need to provide a flow control mechanism and
   segmentation. For the former, we just took the mechanism used by TCP
   (sequence numbers and a sliding window) and used that. It's proven,
   and can be trivially implemented by a minimal implementation of
   BXXP. For the latter, we just put a "continuation" or "more to come"
   flag in the command line for the frame.</t>
</section>

<section title="User Authentication">
<t>We use SASL. If you successfully authenticate using a channel, then
   there is a single user identity for each peer on that connection
   (i.e., authentication is per-connection, not per-channel). This
   design decision mandates that each connection correspond to a single
   user regardless of how many channels are open on that connection.
   One reason why this is important is that it allows service provisioning,
   such as quality of service (e.g., as in <xref target="RFC2549" />) to be
   done on a per-user granularity.</t>

<t>We defined BXXP profiles for the most commonly used SASL mechanisms:
   OTP and Anonymous.</t>
</section>

<section title="Transport Security">
<t>We use TLS. If you successfully complete a TLS negotiation using a
   channel, then all traffic on that connection is secured (i.e.,
   confidentiality is per-connection, not per-channel, just like
   authentication).</t>

<t>We defined a BXXP profile that's used to start the TLS engine.</t>
</section>

<section title="Things We Left Out">
<t>We purposefully excluded two things that are common to most
   application protocols: naming and authorization.</t>

<t>Naming was excluded from the framework because, outside of
 <xref target="RFC2396">URIs</xref>,
there isn't a commonly accepted framework for naming things. To our
   view, this remains a domain-specific problem for each application
   protocol. So, when an application protocol designer defines their
   own profile to do "the useful work", they'll have to deal with
   naming issues themselves. BXXP provides a mechanism for identifying
   profiles and binding them to channels. It's up to you to define the
   profile and use the channel.</t>

<t>Similarly, authorization was explicitly excluded from the framework.
   Every approach to authorization we've seen uses names to identify
   principals (i.e., targets and subjects), so if your framework
   doesn't include naming, it can't very well include authorization.</t>

<t>Of course, application protocols do have to deal with naming and
   authorization &#151; those are two of the issues addressed by the
   applications protocol designer when defining a profile for use with
   BXXP.</t>
</section>
</section>

<section title="Current Status">
<t>So, how do you go about using BXXP?</t>

<t>First, get the <xref target="BXXP">specification</xref> and read it.
   Next, define your own profile. Finally, get a TCP port number
   for your protocol and start implementing.</t>

<t>The BXXP specification defines five profiles itself: a channel
   management profile, three user authentication profiles, and a
   transport layer security profile. These provide good examples. Of
   course, we've been using BXXP internally for a year now, so if you
   want to look at a rather detailed profile definition, check out the <xref target="BSEP">Blocks Simple Exchange</xref> profile. It addresses the issue of naming
   for its application domain, and, in doing so, opens the door for
   authorization.</t>

<t>Since we published BXXP as an Internet-draft for comments we've
   gotten some pretty good feedback. Prior to the next meeting of the
   IETF, we'll be publishing an updated specification along with a
   couple of open source implementations. So, you might want to wait a
   few weeks before you start implementation.</t>
</section>

</middle>

<back>
<references>

<reference anchor='RFC0821'>

<front>
<title>Simple Mail Transfer Protocol</title>
<author initials='J.' surname='Postel' fullname='J. Postel'>
<organization></organization></author>
<date month='Aug' year='1982'></date></front>

<seriesInfo name='RFC' value='821' />
<seriesInfo name='STD' value='10' />
</reference>


<reference anchor="BXXA">

<front>
<title>Blocks: Architectural Precepts</title>


<author initials="M.T." surname="Rose" fullname="Marshall T. Rose">
<organization>Invisible Worlds, Inc.</organization>

<address>
<postal>
<street>1179 North McDowell Boulevard</street>
<city>Petaluma</city> <region>CA</region> <code>94954-6559</code>
<country>US</country>
</postal>

<phone>+1 707 789 3700</phone>
<email>mrose@invisible.net</email>
<uri>http://invisible.net/</uri>
</address>
</author>


<author initials="C." surname="Malamud" fullname="Carl Malamud">
<organization>Invisible Worlds, Inc.</organization>

<address>
<postal>
<street>1179 North McDowell Boulevard</street>
<city>Petaluma</city> <region>CA</region> <code>94954-6559</code>
<country>US</country>
</postal>

<phone>+1 707 789 3700</phone>
<email>carl@invisible.net</email>
<uri>http://invisible.net/</uri>
</address>
</author>


<date month="January" year="2000"/>

<area>Applications</area>
<keyword>Blocks</keyword>
<keyword>BXXP</keyword>
<keyword>BXXS</keyword>
<keyword>SEP</keyword>
<keyword>XML</keyword>
<keyword>navigation spaces</keyword>
<keyword>maps</keyword>

<abstract>
<t>Blocks is an architecture for managing metadata.
The architecture supports two models:
the Blocks exchange model organizes information into navigation spaces,
whilst the Blocks convergence model allows for bulk synchronization
and knowledge management.</t>

<t>This document,
at present,
focuses on the first model.</t>

<t>To subscribe to the Blocks discussion list,
send <eref target="mailto:blocks-request@invisible.net">e-mail</eref>;
there is also a
<eref target="http://mappa.mundi.net/">developers' site</eref>.</t>
</abstract>
</front>


<seriesInfo name="Draft" value="Memo" />
</reference>


<reference anchor='RFC0959'>

<front>
<title>File Transfer Protocol</title>
<author initials='J.' surname='Postel' fullname='J. Postel'>
<organization></organization></author>
<author initials='J.K.' surname='Reynolds' fullname='J.K. Reynolds'>
<organization></organization></author>
<date month='Oct' year='1985'></date></front>

<seriesInfo name='RFC' value='959' />
<seriesInfo name='STD' value='9' />
</reference>


<reference anchor='RFC1945'>

<front>
<title>Hypertext Transfer Protocol -- HTTP/1.0</title>
<author initials='T.' surname='Berners-Lee' fullname='T. Berners-Lee'>
<organization></organization></author>
<author initials='R.' surname='Fielding' fullname='R. Fielding'>
<organization></organization></author>
<author initials='H.' surname='Frystyk' fullname='H. Frystyk'>
<organization></organization></author>
<date month='May' year='1996'></date></front>

<seriesInfo name='RFC' value='1945' />
</reference>


<reference anchor='RFC2565'>

<front>
<title>Internet Printing Protocol/1.0: Encoding and Transport</title>
<author initials='R.' surname='Herriot' fullname='R. Herriot'>
<organization></organization></author>
<date month='April' year='1999'></date></front>

<seriesInfo name='RFC' value='2565' />
</reference>


<reference anchor='RFC2045'>

<front>
<title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
<author initials='N.' surname='Freed' fullname='N. Freed'>
<organization></organization></author>
<author initials='N.' surname='Borenstein' fullname='N. Borenstein'>
<organization></organization></author>
<date month='November' year='1996'></date></front>

<seriesInfo name='RFC' value='2045' />
</reference>


<reference anchor='RFC2616'>

<front>
<title abbrev='HTTP/1.1'>Hypertext Transfer Protocol -- HTTP/1.1</title>
<author initials='R.' surname='Fielding' fullname='Roy T. Fielding'>
<organization>Information and Computer Science</organization>
<address>
<postal>
<street>University of California, Irvine</street>
<city>Irvine</city>
<region>CA </region>
<code>92697-3425</code>
<country>US</country></postal>
<phone>+1 949 824 1715</phone>
<email>fielding@ics.uci.edu</email></address></author>
<author initials='J.' surname='Gettys' fullname='James Gettys'>
<organization>World Wide Web Consortium</organization>
<address>
<postal>
<street>MIT Laboratory for Computer Science</street>
<street>545 Technology Square</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code>
<country>US</country></postal>
<phone>+1 617 258 8682</phone>
<email>jg@w3.org</email></address></author>
<author initials='J.' surname='Mogul' fullname='Jeffrey C. Mogul'>
<organization>Western Research Laboratory</organization>
<address>
<postal>
<street>Compaq Computer Corporation</street>
<street>250 University Avenue</street>
<city>Palo Alto</city>
<region>CA</region>
<code>94305</code>
<country>US</country></postal>
<email>mogul@wrl.dec.com</email></address></author>
<author initials='H.' surname='Frystyk' fullname='Henrik Frystyk'>
<organization>World Wide Web Consortium</organization>
<address>
<postal>
<street>MIT Laboratory for Computer Science</street>
<street>545 Technology Square</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code>
<country>US</country></postal>
<email>frystyk@w3.org</email></address></author>
<author initials='L.' surname='Masinter' fullname='Larry Masinter'>
<organization>Xerox Corporation</organization>
<address>
<postal>
<street>3333 Coyote Hill Road</street>
<city>Palo Alto</city>
<region>CA</region>
<code>94034</code>
<country>US</country></postal>
<email>masinter@parc.xerox.com</email></address></author>
<author initials='P.' surname='Leach' fullname='Paul J. Leach'>
<organization>Microsoft Corporation</organization>
<address>
<postal>
<street>1 Microsoft Way</street>
<city>Redmond</city>
<region>WA</region>
<code>98052</code>
<country>US</country></postal>
<email>paulle@microsoft.com</email></address></author>
<author initials='T.' surname='Berners-Lee' fullname='Tim Berners-Lee'>
<organization>World Wide Web Consortium</organization>
<address>
<postal>
<street>MIT Laboratory for Computer Science</street>
<street>545 Technology Square</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code>
<country>US</country></postal>
<email>timbl@w3.org</email></address>>
</author>
<date month='June' year='1999'></date>
<abstract>
<t>The Hypertext Transfer Protocol (HTTP) is an application-level
protocol for distributed, collaborative, hypermedia information
systems.
It is a generic, stateless, protocol which can be used for
many tasks beyond its use for hypertext, such as name servers and
distributed object management systems, through extension of its
request methods, error codes and headers .
A feature of HTTP is
the typing and negotiation of data representation, allowing systems
to be built independently of the data being transferred.</t>
<t>HTTP has been in use by the World-Wide Web global information
initiative since 1990.
This specification defines the protocol
referred to as "HTTP/1.1", and is an update to
.</t></abstract></front>

<seriesInfo name='RFC' value='2616' />
</reference>


<reference anchor='RFC0793'>

<front>
<title>Transmission Control Protocol</title>
<author initials='J.' surname='Postel' fullname='J. Postel'>
<organization></organization></author>
<date month='Sep' year='1981'></date></front>

<seriesInfo name='RFC' value='793' />
<seriesInfo name='STD' value='7' />
</reference>


<reference anchor='RFC1034'>

<front>
<title>Domain names - concepts and facilities</title>
<author initials='P.V.' surname='Mockapetris' fullname='P.V. Mockapetris'>
<organization></organization></author>
<date month='Nov' year='1987'></date></front>

<seriesInfo name='RFC' value='1034' />
<seriesInfo name='STD' value='13' />
</reference>


<reference anchor='RFC1094'>

<front>
<title>NFS: Network File System Protocol specification</title>
<author initials='Sun' surname='Microsystems' fullname='Sun Microsystems'>
<organization></organization></author>
<date month='Mar' year='1989'></date></front>

<seriesInfo name='RFC' value='1094' />
</reference>


<reference anchor='RFC2663'>

<front>
<title abbrev='NAT Terminology and Considerations'>IP Network Address Translator (NAT) Terminology and Considerations</title>
<author initials='P.' surname='Srisuresh' fullname='Pyda Srisuresh'>
<organization>Lucent Technologies</organization>
<address>
<postal>
<street>4464 Willow Road</street>
<city>Pleasanton</city>
<region>CA</region>
<code>94588-8519</code>
<country>US</country></postal>
<phone>+1 925 737 2153</phone>
<email>srisuresh@lucent.com</email></address></author>
<author initials='M.' surname='Holdrege' fullname='Matt Holdrege'>
<organization>Lucent Technologiesv</organization>
<address>
<postal>
<street>1701 Harbor Bay Parkway</street>
<city>Alameda</city>
<region>CA</region>
<code>94502</code>
<country>US</country></postal>
<phone>+1 510 769 6001</phone>
<email>holdrege@lucent.com</email></address></author>
<date month='August' year='1999'></date>
<abstract>
<t>Network Address Translation is a method by which IP addresses are
mapped from one realm to another, in an attempt to provide
transparent routing to hosts.
Traditionally, NAT devices are used to
connect an isolated address realm with private unregistered addresses
to an external realm with globally unique registered addresses.
This
document attempts to describe the operation of NAT devices and the
associated considerations in general, and to define the terminology
used to identify various flavors of NAT.</t></abstract></front>

<seriesInfo name='RFC' value='2663' />
</reference>


<reference anchor='RFC0822'>

<front>
<title>Standard for the format of ARPA Internet text messages</title>
<author initials='D.' surname='Crocker' fullname='D. Crocker'>
<organization></organization></author>
<date month='Aug' year='1982'></date></front>

<seriesInfo name='RFC' value='822' />
<seriesInfo name='STD' value='11' />
</reference>


<reference anchor='RFC1866'>

<front>
<title>Hypertext Markup Language - 2.0</title>
<author initials='T.' surname='Berners-Lee' fullname='T. Berners-Lee'>
<organization></organization></author>
<author initials='D.' surname='Connolly' fullname='D. Connolly'>
<organization></organization></author>
<date month='November' year='1995'></date></front>

<seriesInfo name='RFC' value='1866' />
</reference>


<reference anchor='RFC2034'>

<front>
<title abbrev='SMTP Enhanced Error Codes'>SMTP Service Extension for Returning Enhanced Error Codes</title>
<author initials='N.' surname='Freed' fullname='Ned Freed'>
<organization>Innosoft International, Inc.</organization>
<address>
<postal>
<street>1050 East Garvey Avenue South</street>
<street>West Covina</street>
<street>CA 91790</street>
<country>USA</country></postal>
<phone>+1 818 919 3600           fax: +1 818 919 3614</phone>
<email>ned@innosoft.com</email></address></author>
<date month='October' year='1996'></date>
<area>Applications</area>
<keyword>SMTP</keyword>
<keyword>point-to-point protocol</keyword>
<keyword>simple mail transfer protocol</keyword></front>

<seriesInfo name='RFC' value='2034' />
</reference>


<reference anchor='RFC2197'>

<front>
<title abbrev='SMTP Service Extension'>SMTP Service Extension for Command Pipelining</title>
<author initials='N.' surname='Freed' fullname='Ned Freed'>
<organization>Innosoft International, Inc.</organization>
<address>
<postal>
<street>1050 Lakes Drive</street>
<street>West Covina</street>
<street>CA 91790</street>
<country>USA</country></postal>
<phone>+1 626 919 3600</phone>
<facsimile>+1 626 919 3614</facsimile>
<email>ned.freed@innosoft.com</email></address></author>
<date month='September' year='1997'></date>
<area>Applications</area>
<keyword>SMTP</keyword>
<keyword>simple mail transfer protocol</keyword></front>

<seriesInfo name='RFC' value='2197' />
</reference>


<reference anchor='RFC2660'>

<front>
<title>The Secure HyperText Transfer Protocol</title>
<author initials='E.' surname='Rescorla' fullname='Eric Rescorla'>
<organization>RTFM, Inc.</organization>
<address>
<postal>
<street>30 Newell Road, #16</street>
<city>East Palo Alto</city>
<region>CA</region>
<code>94303</code>
<country>US</country></postal>
<phone>+1 650 328 8631</phone>
<email>ekr@rtfm.com</email></address></author>
<author initials='A.' surname='Schiffman' fullname='A. Schiffman'>
<organization>SPYRUS/Terisa</organization>
<address>
<postal>
<street>5303 Betsy Ross Drive</street>
<city>Santa Clara</city>
<region>CA</region>
<code>95054</code>
<country>US</country></postal>
<phone>+1 408 327 1901</phone>
<email>ams@terisa.com</email></address></author>
<date month='August' year='1999'></date>
<abstract>
<t>This memo describes a syntax for securing messages sent using the
Hypertext Transfer Protocol (HTTP), which forms the basis for the
World Wide Web.
Secure HTTP (S-HTTP) provides independently
applicable security services for transaction confidentiality,
authenticity/integrity and non-repudiability of origin.</t>
<t>The protocol emphasizes maximum flexibility in choice of key
management mechanisms, security policies and cryptographic algorithms
by supporting option negotiation between parties for each
transaction.</t></abstract></front>

<seriesInfo name='RFC' value='2660' />
</reference>


<reference anchor='RFC2222'>

<front>
<title abbrev='SASL'>Simple Authentication and Security Layer (SASL)</title>
<author initials='J.G.' surname='Myers' fullname='John G. Myers'>
<organization>Netscape Communications</organization>
<address>
<postal>
<street>501 E. Middlefield Road</street>
<street>Mail Stop MV-029</street>
<street>Mountain View</street>
<street>CA 94043-4042</street></postal>
<email>jgmyers@netscape.com</email></address></author>
<date month='October' year='1997'></date>
<area>Security</area>
<keyword>authentication</keyword>
<keyword>security</keyword></front>

<seriesInfo name='RFC' value='2222' />
</reference>


<reference anchor='RFC2444'>

<front>
<title abbrev='OTP SASL Mechanism'>The One-Time-Password SASL Mechanism</title>
<author initials='C.' surname='Newman' fullname='Chris Newman'>
<organization>Innosoft International, Inc.</organization>
<address>
<postal>
<street>1050 Lakes Drive</street>
<street>West Covina</street>
<street>CA 91790</street>
<country>USA</country></postal>
<email>chris.newman@innosoft.com</email></address></author>
<date month='October' year='1998'></date>
<area>Security</area>
<keyword>OTP</keyword>
<keyword>authentication</keyword>
<keyword>one-time password</keyword>
<keyword>password</keyword>
<abstract>
<t>
   OTP  provides a useful authentication mechanism for situations
   where there is limited client or server trust.  Currently, OTP is
   added to protocols in an ad-hoc fashion with heuristic parsing.  This
   specification defines an OTP SASL  mechanism so it can be
   easily and formally integrated into many application protocols.
</t></abstract></front>

<seriesInfo name='RFC' value='2444' />
</reference>


<reference anchor='RFC2554'>

<front>
<title>SMTP Service Extension for Authentication</title>
<author initials='J.' surname='Myers' fullname='J. Myers'>
<organization></organization></author>
<date month='March' year='1999'></date></front>

<seriesInfo name='RFC' value='2554' />
</reference>


<reference anchor='RFC2617'>

<front>
<title abbrev='HTTP Authentication'>HTTP Authentication: Basic and Digest Access Authentication</title>
<author initials='J.' surname='Franks' fullname='John Franks'>
<organization>Department of Mathematics</organization>
<address>
<postal>
<street>Northwestern University</street>
<city>Evanston</city>
<region>IL</region>
<code>60208-2730</code>
<country>US</country></postal>
<email>john@math.nwu.edu</email></address></author>
<author initials='P.' surname='Hallam-Baker' fullname='Phillip M. Hallam-Baker'>
<organization>Verisign Inc.</organization>
<address>
<postal>
<street>301 Edgewater Place</street>
<street>Suite 210</street>
<city>Wakefield</city>
<region>MA</region>
<code>01880</code>
<country>US</country></postal>
<email>pbaker@verisign.com</email></address></author>
<author initials='J.' surname='Hostetler' fullname='Jeffery L. Hostetler'>
<organization>AbiSource, Inc.</organization>
<address>
<postal>
<street>6 Dunlap Court</street>
<city>Savoy</city>
<region>IL</region>
<code>61874</code>
<country>US</country></postal>
<email>jeff@AbiSource.com</email></address></author>
<author initials='S.' surname='Lawrence' fullname='Scott D. Lawrence'>
<organization>Agranat Systems, Inc.</organization>
<address>
<postal>
<street>5 Clocktower Place</street>
<street>Suite 400</street>
<city>Maynard</city>
<region>MA</region>
<code>01754</code>
<country>US</country></postal>
<email>lawrence@agranat.com</email></address></author>
<author initials='P.' surname='Leach' fullname='Paul J. Leach'>
<organization>Microsoft Corporation</organization>
<address>
<postal>
<street>1 Microsoft Way</street>
<city>Redmond</city>
<region>WA</region>
<code>98052</code>
<country>US</country></postal>
<email>paulle@microsoft.com</email></address></author>
<author initials='A.' surname='Luotonen' fullname='Ari Luotonen'>
<organization>Netscape Communications Corporation</organization>
<address>
<postal>
<street>501 East Middlefield Road</street>
<city>Mountain View</city>
<region>CA</region>
<code>94043</code>
<country>US</country></postal></address></author>
<author initials='L.' surname='Stewart' fullname='Lawrence C.  Stewart'>
<organization>Open Market, Inc.</organization>
<address>
<postal>
<street>215 First Street</street>
<city>Cambridge</city>
<region>MA</region>
<code>02142</code>
<country>US</country></postal>
<email>stewart@OpenMarket.com</email></address></author>
<date month='June' year='1999'></date>
<abstract>
<t>"HTTP/1.0", includes the specification for a Basic Access
Authentication scheme.
This scheme is not considered to be a secure
method of user authentication (unless used in conjunction with some
external secure system such as SSL),
as the user name and
password are passed over the network as cleartext.</t>
<t>This document also provides the specification for HTTP's
authentication framework, the original Basic authentication scheme
and a scheme based on cryptographic hashes, referred to as "Digest
Access Authentication".
It is therefore also intended to serve as a
replacement for .
Some optional elements specified by
RFC 2069 have been removed from this specification due to problems
found since its publication; other new elements have been added for
compatibility, those new elements have been made optional, but are
strongly recommended.</t></abstract></front>

<seriesInfo name='RFC' value='2617' />
</reference>


<reference anchor='RFC2401'>

<front>
<title abbrev='Security Architecture'>Security Architecture for the Internet Protocol</title>
<author initials='S.' surname='Kent' fullname='Stephen Kent'>
<organization>BBN Corporation</organization>
<address>
<postal>
<street>70 Fawcett Street</street>
<street>Cambridge</street>
<street>MA  02140</street>
<country>USA</country></postal>
<phone>+1 (617) 873-3988</phone>
<email>kent@bbn.com</email></address></author>
<author initials='R.' surname='Atkinson' fullname='Randall Atkinson'>
<organization>@Home Network</organization>
<address>
<postal>
<street>425 Broadway</street>
<street>Redwood City</street>
<street>CA 94063</street>
<country>USA</country></postal>
<phone>+1 (415) 569-5000</phone>
<email>rja@corp.home.net</email></address></author>
<date month='November' year='1998'></date>
<area>Security</area>
<keyword>IP security protocol</keyword>
<keyword>IPSEC</keyword>
<keyword>internet protocol version 6</keyword>
<keyword>security</keyword></front>

<seriesInfo name='RFC' value='2401' />
</reference>


<reference anchor='RFC2246'>

<front>
<title>The TLS Protocol Version 1.0</title>
<author initials='T.' surname='Dierks' fullname='T. Dierks'>
<organization></organization></author>
<author initials='C.' surname='Allen' fullname='C. Allen'>
<organization></organization></author>
<date month='January' year='1999'></date></front>

<seriesInfo name='RFC' value='2246' />
</reference>


<reference anchor='RFC2244'>

<front>
<title>ACAP -- Application Configuration Access Protocol</title>
<author initials='C.' surname='Newman' fullname='C. Newman'>
<organization></organization></author>
<author initials='J. G.' surname='Myers' fullname='J. G. Myers'>
<organization></organization></author>
<date month='November' year='1997'></date></front>

<seriesInfo name='RFC' value='2244' />
</reference>


<reference anchor='RFC1939'>

<front>
<title>Post Office Protocol - Version 3</title>
<author initials='J.' surname='Myers' fullname='J. Myers'>
<organization></organization></author>
<author initials='M.' surname='Rose' fullname='M. Rose'>
<organization></organization></author>
<date month='May' year='1996'></date></front>

<seriesInfo name='RFC' value='1939' />
<seriesInfo name='STD' value='53' />
</reference>


<reference anchor='RFC1731'>

<front>
<title>IMAP4 Authentication Mechanisms</title>
<author initials='J.' surname='Myers' fullname='J. Myers'>
<organization></organization></author>
<date month='December' year='1994'></date></front>

<seriesInfo name='RFC' value='1731' />
</reference>


<reference anchor='RFC2309'>

<front>
<title abbrev='Internet Performance Recommendations'>Recommendations on Queue Management and Congestion Avoidance in the Internet</title>
<author initials='B.' surname='Braden' fullname='Bob Braden'>
<organization>USC Information Sciences Institute</organization>
<address>
<postal>
<street>4676 Admiralty Way</street>
<city>Marina del Rey</city>
<region>CA</region>
<code>90292</code></postal>
<phone>310-822-1511</phone>
<email>Braden@ISI.EDU</email></address></author>
<author initials='D.D.' surname='Clark' fullname='David D. Clark'>
<organization>MIT Laboratory for Computer Science</organization>
<address>
<postal>
<street>545 Technology Sq.</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code></postal>
<phone>617-253-6003</phone>
<email>DDC@lcs.mit.edu</email></address></author>
<author initials='J.' surname='Crowcroft' fullname='Jon Crowcroft'>
<organization>University College London</organization>
<address>
<postal>
<street>Department of Computer Science</street>
<street>Gower Street</street>
<street>London, WC1E 6BT</street>
<street>ENGLAND</street></postal>
<phone>+44 171 380 7296</phone>
<email>Jon.Crowcroft@cs.ucl.ac.uk</email></address></author>
<author initials='B.' surname='Davie' fullname='Bruce Davie'>
<organization>Cisco Systems, Inc.</organization>
<address>
<postal>
<street>250 Apollo Drive</street>
<city>Chelmsford</city>
<region>MA</region>
<code>01824</code></postal>
<email>bdavie@cisco.com</email></address></author>
<author initials='S.' surname='Deering' fullname='Steve Deering'>
<organization>Cisco Systems, Inc.</organization>
<address>
<postal>
<street>170 West Tasman Drive</street>
<city>San Jose</city>
<region>CA</region>
<code>95134-1706</code></postal>
<phone>408-527-8213</phone>
<email>deering@cisco.com</email></address></author>
<author initials='D.' surname='Estrin' fullname='Deborah Estrin'>
<organization>USC Information Sciences Institute</organization>
<address>
<postal>
<street>4676 Admiralty Way</street>
<city>Marina del Rey</city>
<region>CA</region>
<code>90292</code></postal>
<phone>310-822-1511</phone>
<email>Estrin@usc.edu</email></address></author>
<author initials='S.' surname='Floyd' fullname='Sally Floyd'>
<organization>Lawrence Berkeley National Laboratory, MS 50B-2239, One Cyclotron Road, Berkeley CA 94720</organization>
<address>
<phone>510-486-7518</phone>
<email>Floyd@ee.lbl.gov</email></address></author>
<author initials='V.' surname='Jacobson' fullname='Van Jacobson'>
<organization>Lawrence Berkeley National Laboratory, MS 46A, One Cyclotron Road, Berkeley CA 94720</organization>
<address>
<phone>510-486-7519</phone>
<email>Van@ee.lbl.gov</email></address></author>
<author initials='G.' surname='Minshall' fullname='Greg Minshall'>
<organization>Fiberlane Communications</organization>
<address>
<postal>
<street>1399 Charleston Road</street>
<city>Mountain View</city>
<region>CA</region>
<code>94043</code></postal>
<phone>+1 650 237 3164</phone>
<email>Minshall@fiberlane.com</email></address></author>
<author initials='C.' surname='Partridge' fullname='Craig Partridge'>
<organization>BBN Technologies</organization>
<address>
<postal>
<street>10 Moulton St.</street>
<street>Cambridge MA 02138</street></postal>
<phone>510-558-8675</phone>
<email>craig@bbn.com</email></address></author>
<author initials='L.' surname='Peterson' fullname='Larry Peterson'>
<organization>Department of Computer Science</organization>
<address>
<postal>
<street>University of Arizona</street>
<city>Tucson</city>
<region>AZ</region>
<code>85721</code></postal>
<phone>520-621-4231</phone>
<email>LLP@cs.arizona.edu</email></address></author>
<author initials='K.K.' surname='Ramakrishnan' fullname='K. K. Ramakrishnan'>
<organization>AT&amp;T Labs. Research</organization>
<address>
<postal>
<street>Rm. A155</street>
<street>180 Park Avenue</street>
<street>Florham Park, N.J. 07932</street></postal>
<phone>973-360-8766</phone>
<email>KKRama@research.att.com</email></address></author>
<author initials='S.' surname='Shenker' fullname='Scott Shenker'>
<organization>Xerox PARC</organization>
<address>
<postal>
<street>3333 Coyote Hill Road</street>
<city>Palo Alto</city>
<region>CA</region>
<code>94304</code></postal>
<phone>415-812-4840</phone>
<email>Shenker@parc.xerox.com</email></address></author>
<author initials='J.' surname='Wroclawski' fullname='John Wroclawski'>
<organization>MIT Laboratory for Computer Science</organization>
<address>
<postal>
<street>545 Technology Sq.</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code></postal>
<phone>617-253-7885</phone>
<email>JTW@lcs.mit.edu</email></address></author>
<author initials='L.' surname='Zhang' fullname='Lixia Zhang'>
<organization>UCLA</organization>
<address>
<postal>
<street>4531G Boelter Hall</street>
<city>Los Angeles</city>
<region>CA</region>
<code>90024</code></postal>
<phone>310-825-2695</phone>
<email>Lixia@cs.ucla.edu</email></address></author>
<date month='April' year='1998'></date>
<area>Routing</area>
<keyword>congestion</keyword>
<abstract>
<t>

      This memo presents two recommendations to the Internet community

      concerning measures to improve and preserve Internet performance.

      It presents a strong recommendation for testing, standardization,

      and widespread deployment of active queue management in routers,

      to improve the performance of today's Internet.  It also urges a

      concerted effort of research, measurement, and ultimate deployment

      of router mechanisms to protect the Internet from flows that are

      not sufficiently responsive to congestion notification.
</t></abstract></front>

<seriesInfo name='RFC' value='2309' />
</reference>


<reference anchor='RFC0854'>

<front>
<title>Telnet Protocol Specification</title>
<author initials='J.' surname='Postel' fullname='J. Postel'>
<organization></organization></author>
<author initials='J.K.' surname='Reynolds' fullname='J.K. Reynolds'>
<organization></organization></author>
<date month='May' year='1983'></date></front>

<seriesInfo name='RFC' value='854' />
</reference>


<reference anchor="W3C.XML"
           target="http://www.w3.org/TR/1998/REC-xml-19980210">
<front>
<title>Extensible Markup Language (XML) 1.0</title>


<author>
<organization abbrev="W3C">World Wide Web Consortium</organization>

<address>
<postal>
<street>MIT Laboratory for Computer Science</street>
<street>545 Technology Square</street>
<city>Cambridge</city> <region>MA</region> <code>02139</code>
<country>US</country>
</postal>

<phone>+ 1 617 253 2613</phone>
<facsimile>+ 1 617 258 5999</facsimile>
<email>timbl@w3.org</email>
<uri>http://www.w3c.org</uri>
</address>
</author>


<date month="February" year="1998"/>
</front>

<seriesInfo name="W3C" value="XML" />
</reference>


<reference anchor='RFC2549'>

<front>
<title>IP over Avian Carriers with Quality of Service</title>
<author initials='D.' surname='Waitzman' fullname='D. Waitzman'>
<organization></organization></author>
<date month='April' year='1999'></date></front>

<seriesInfo name='RFC' value='2549' />
</reference>


<reference anchor='RFC2396'>

<front>
<title abbrev='URI Generic Syntax'>Uniform Resource Identifiers (URI): Generic Syntax</title>
<author initials='T.' surname='Berners-Lee' fullname='Tim Berners-Lee'>
<organization>World Wide Web Consortium</organization>
<address>
<postal>
<street>MIT Laboratory for Computer Science, NE43-356</street>
<street>545 Technology Square</street>
<city>Cambridge</city>
<region>MA</region>
<code>02139</code></postal>
<facsimile>+1(617)258-8682</facsimile>
<email>timbl@w3.org</email></address></author>
<author initials='R.T.' surname='Fielding' fullname='Roy T. Fielding'>
<organization>Department of Information and Computer Science</organization>
<address>
<postal>
<street>University of California, Irvine</street>
<city>Irvine</city>
<region>CA</region>
<code>92697-3425</code></postal>
<facsimile>+1(949)824-1715</facsimile>
<email>fielding@ics.uci.edu</email></address></author>
<author initials='L.' surname='Masinter' fullname='Larry Masinter'>
<organization>Xerox PARC</organization>
<address>
<postal>
<street>3333 Coyote Hill Road</street>
<city>Palo Alto</city>
<region>CA</region>
<code>94034</code></postal>
<facsimile>+1(415)812-4333</facsimile>
<email>masinter@parc.xerox.com</email></address></author>
<date month='August' year='1998'></date>
<area>Applications</area>
<keyword>uniform resource</keyword>
<keyword>URI</keyword>
<abstract>
<t>

   A Uniform Resource Identifier (URI) is a compact string of characters

   for identifying an abstract or physical resource.  This document

   defines the generic syntax of URI, including both absolute and

   relative forms, and guidelines for their use; it revises and replaces

   the generic definitions in RFC 1738 and RFC 1808.
</t>
<t>



   This document defines a grammar that is a superset of all valid URI,

   such that an implementation can parse the common components of a URI

   reference without knowing the scheme-specific requirements of every

   possible identifier type.  This document does not define a generative

   grammar for URI; that task will be performed by the individual

   specifications of each URI scheme.
</t></abstract>
<note title='IESG Note'>
<t>

   This paper describes a "superset" of operations that can be applied

   to URI.  It consists of both a grammar and a description of basic

   functionality for URI.  To understand what is a valid URI, both the

   grammar and the associated description have to be studied.  Some of

   the functionality described is not applicable to all URI schemes, and

   some operations are only possible when certain media types are

   retrieved using the URI, regardless of the scheme used.
</t></note></front>

<seriesInfo name='RFC' value='2396' />
</reference>


<reference anchor="BSEP">

<front>
<title>The Blocks Simple Exchange Profile</title>


<author initials="M.T." surname="Rose" fullname="Marshall T. Rose">
<organization>Invisible Worlds, Inc.</organization>

<address>
<postal>
<street>1179 North McDowell Boulevard</street>
<city>Petaluma</city> <region>CA</region> <code>94954-6559</code>
<country>US</country>
</postal>

<phone>+1 707 789 3700</phone>
<email>mrose@invisible.net</email>
<uri>http://invisible.net/</uri>
</address>
</author>


<date month="January" year="2000"/>

<area>Applications</area>
<keyword>Blocks</keyword>
<keyword>BXXP</keyword>
<keyword>XML</keyword>
<keyword>navigation spaces</keyword>
<keyword>mapping</keyword>

<abstract><t><xref target="BXXA">Blocks</xref> is an architecture for
managing metadata.
The architecture supports two models:
the Blocks exchange model organizes information into navigation spaces,
whilst the Blocks convergence model allows for bulk synchronization
and knowledge management.</t>

<t>This memo describes the Simple Exchange Profile (SEP) used to exchange
objects,
termed blocks,
residing in an SEP datastore.</t>

<t>To subscribe to the Blocks discussion list,
send <eref target="mailto:blocks-request@invisible.net">e-mail</eref>;
there is also a
<eref target="http://mappa.mundi.net/">developers' site</eref>.</t>
</abstract>
</front>


<seriesInfo name="Draft" value="Memo" />
</reference>


<reference anchor="BXXP">

<front>
<title>The Blocks eXtensible eXchange Protocol</title>


<author initials="M.T." surname="Rose" fullname="Marshall T. Rose">
<organization>Invisible Worlds, Inc.</organization>

<address>
<postal>
<street>1179 North McDowell Boulevard</street>
<city>Petaluma</city> <region>CA</region> <code>94954-6559</code>
<country>US</country>
</postal>

<phone>+1 707 789 3700</phone>
<email>mrose@invisible.net</email>
<uri>http://invisible.net/</uri>
</address>
</author>


<date month="February" year="2000"/>

<area>Applications</area>
<keyword>Blocks</keyword>
<keyword>BXXP</keyword>
<keyword>XML</keyword>
<keyword>navigation spaces</keyword>
<keyword>mapping</keyword>

<abstract><t>This memo describes the Blocks eXtensible eXchange Protocol
(BXXP),
a generic application protocol framework for connection-oriented,
asynchronous request-response interactions.
BXXP permits both
multiplexing of independent request/response streams over a single
transport connection,
as well as segmentation and flow control of both textual and binary
messages.</t>

<t>To subscribe to the Blocks discussion list,
send <eref target="mailto:blocks-request@invisible.net">e-mail</eref>;
there is also a
<eref target="http://mappa.mundi.net/">developers' site</eref>.</t>
</abstract>
</front>


<seriesInfo name="Draft" value="Memo" />
</reference>

</references>
</back>

</rfc>


