Adding a copy of memcached to the tree.
[awesomized/libmemcached] / memcached / doc / protocol-binary-range.xml
diff --git a/memcached/doc/protocol-binary-range.xml b/memcached/doc/protocol-binary-range.xml
new file mode 100644 (file)
index 0000000..02711a8
--- /dev/null
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!DOCTYPE rfc SYSTEM "xml2rfc/rfc2629.dtd">
+<?xml-stylesheet type='text/xsl' href='xml2rfc/rfc2629.xslt'?>
+<?rfc toc="yes"?>
+<?rfc strict="yes"?>
+<?rfc symrefs="yes"?>
+<?rfc sortrefs="yes" ?>
+<?rfc compact="yes" ?>
+<?rfc subcompact="yes" ?>
+<rfc category="info" docName="draft-stone-memcache-udp-01" ipr="none">
+
+  <front>
+
+    <title abbrev="Memcache Over UDP"> Memcache Binary Protocol: Extensions for UDP </title>
+
+    <author fullname="Aaron Stone" surname="Aaron Stone" role="editor">
+      <organization>Six Apart, Ltd.</organization>
+      <address>
+        <postal>
+          <street>548 4th Street</street>
+          <city>San Francisco</city>
+          <region>CA</region>
+          <code>94107</code>
+          <country>USA</country>
+        </postal>
+        <email>aaron@serendipity.palo-alto.ca.us</email>
+      </address>
+    </author>
+
+    <date day="14" month="December" year="2007" />
+
+    <area>Applications</area>
+
+    <keyword>memcache memcached cache udp</keyword>
+
+    <abstract>
+      <t>
+      This memo explains extensions to the memcache binary protocol for use in a UDP environment.
+      </t>
+
+      <t>
+      Memcache is a high performance key-value cache. It is intentionally a
+      dumb cache, optimized for speed only. Applications using memcache do
+      not rely on it for data -- a persistent database with guaranteed reliability
+      is strongly recommended -- but applications can run much faster when
+      cached data is available in memcache.
+      </t>
+    </abstract>
+  </front>
+
+  <middle>
+    <section anchor="introduction" title="Introduction">
+      <t>
+      Memcache is a high performance key-value cache. It is intentionally a
+      dumb cache, optimized for speed only. Applications using memcache do
+      not rely on it for data -- a persistent database with guaranteed reliability
+      is strongly recommended -- but applications can run much faster when
+      cached data is available in memcache.
+      </t>
+      <t>
+      Sites may find that, due to their network architecture or application usage patterns,
+      the stateless <xref target="UDP"/> protocol better suits their needs. This document
+      provides extensions and descriptions of use of the <xref target="MEMCACHE">memcache protocol</xref>
+      in a UDP environment.
+      </t>
+      <t>
+      It is a goal of this document to provide sufficient information in each UDP packet
+      as to avoid any requirement for statefulness on the part of the server nor significant
+      caching of outstanding packets on the part of the client.
+      </t>
+      <section anchor="conventions" title="Conventions Used In This Document">
+        <t>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 <xref target="KEYWORDS"/>.
+        </t>
+      </section>
+    </section>
+
+    <section anchor="values" title="Defined Values">
+      <section anchor="value-magic" title="Magic Byte">
+        <t>
+        The magic bytes remains the same as in <xref target="MEMCACHE"/>.
+        </t>
+      </section>
+
+      <section anchor="value-status" title="Response Status">
+        <t>
+        Additional status values:
+        <list hangIndent="8" style="hanging">
+          <t hangText="0x0004">Value is larger than a single response packet</t>
+        </list>
+        </t>
+      </section>
+
+      <section anchor="value-opcodes" title="Command Opcodes">
+        <t>
+        Additional opcode values:
+        <list hangIndent="8" style="hanging">
+          <t hangText="0x0C">Get Range</t>
+          <t hangText="0x0D">Set Range</t>
+        </list>
+        </t>
+      </section>
+
+      <section anchor="value-types" title="Data Types">
+        <t>
+        There are no new data types in this extension.
+        </t>
+      </section>
+    </section>
+
+    <section anchor="commands" title="Commands">
+
+      <section anchor="command-get" title="Get Response">
+        <t>
+        This section extends the behavior of the Get and GetQ commands as described in
+        <xref target="MEMCACHE" x:sec="command-get"/>.
+        </t>
+
+        <t>
+        When a Get or GetQ request is made via UDP, and the value of the key for which
+        the request was made is larger than can be placed into a single UDP packet (noting
+        that the protocol header must also be counted), a Get Range response packet
+        MUST be sent instead of the Get response packet. In this instance:
+        <list style="numbers">
+          <t>The Status field of the response header MUST be 0x0004.</t>
+          <t>The Offset field of the GetR response extras MUST be 0.</t>
+          <t>The Length field of the GetR response extras, and the data contained in
+             the Value field of the packet, SHOULD be the maximum
+             allowed length of a UDP packet, less the space required by the header
+             and extras; however it MAY be any amount below this maximum.</t>
+          <t>The Total value length field of the response extras MUST be the
+             actual length of the complete value.</t>
+        </list>
+        </t>
+
+        <t>
+        The client, upon receipt of a Get Range response bearing Status 0x004
+        and a Message ID corresponding to its Get request, shall then know that
+        it has received only the first portion of the value. The client MAY choose
+        to request the remaining portion of the value by sending one or more Get Range requests.
+        </t>
+      </section>
+
+      <section anchor="command-getr-request" title="Get Range Request">
+        <t>
+         The Get Range request is primarily intended for use over a UDP transport
+         to request byte ranges of the value for a key. In the event that the Data version
+         check fails to match that of the key, an error MUST be returned.
+       </t>
+        <t>
+      <figure>
+        <preamble>Extra data for get range request:</preamble>
+          <artwork>
+Byte/     0       |       1       |       2       |       3       |
+   /              |               |               |               |
+  |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+  +---------------+---------------+---------------+---------------+
+ 0| Flags                                                         |
+  +---------------+---------------+---------------+---------------+
+ 4| Data version check                                            |
+  |                                                               |
+  +---------------+---------------+---------------+---------------+
+12| Offset                                                        |
+  +---------------+---------------+---------------+---------------+
+16| Length                                                        |
+  +---------------+---------------+---------------+---------------+
+Total 20 bytes
+      </artwork></figure>
+        </t>
+      </section>
+
+      <section anchor="command-getr-response" title="Get Range Response">
+        <t>
+         The Get Range request is primarily intended for use over a UDP transport
+         to indicate the location of the bytes of the value for a key contained in
+         a given packet. A client receives enough information in each Get Range
+         extras to construct an appropriately sized buffer in its own memory and
+         blindly insert the contents of the packet at the given byte offset.
+       </t>
+        <t>
+      <figure>
+        <preamble>Extra data for get range response:</preamble>
+          <artwork>
+Byte/     0       |       1       |       2       |       3       |
+   /              |               |               |               |
+  |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+  +---------------+---------------+---------------+---------------+
+ 0| Flags                                                         |
+  +---------------+---------------+---------------+---------------+
+ 4| Data version check                                            |
+  |                                                               |
+  +---------------+---------------+---------------+---------------+
+12| Offset                                                        |
+  +---------------+---------------+---------------+---------------+
+16| Length                                                        |
+  +---------------+---------------+---------------+---------------+
+20| Total value length                                            |
+  +---------------+---------------+---------------+---------------+
+Total 24 bytes
+      </artwork></figure>
+        </t>
+      </section>
+
+    </section>
+
+    <section anchor="security" title="Security Considerations">
+      <t>
+      This document does not introduce any new security considerations
+      beyond those discussed in <xref target="MEMCACHE" x:sec="security"/>.
+      </t>
+    </section>
+
+  </middle>
+
+  <back>
+    <references title="Normative References">
+      <dwdrfc-ref anchor='UDP' src='http://xml.resource.org/public/rfc/bibxml/reference.RFC.0768.xml'/>
+      <dwdrfc-ref anchor='KEYWORDS' src='http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml'/>
+      <!-- FIXME: Get a draft reference for the base document. -->
+      <dwdrfc-ref anchor='MEMCACHE' src='http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml'/>
+    </references>
+  </back>
+
+</rfc>
+