Internet DRAFT - draft-bollow-qqp
draft-bollow-qqp
Norbert Bollow
Internet-Draft Tenthnet Project
Expires: November 5, 2006 May 6, 2006
QQP - Quick Queues Protocol
<draft-bollow-qqp-02.txt>
Status of this Memo
By submitting this Internet-Draft, each author represents that any
applicable patent or other IPR claims of which he or she is aware
have been or will be disclosed, and any of which he or she becomes
aware will be disclosed, in accordance with Section 6 of BCP 79.
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.
This Internet-Draft will expire on November 5, 2006.
Copyright Notice
Copyright (C) The Internet Society (2006).
Abstract
The QQP protocol specifies a method for transmitting multiple
webservice requests and responses between two Hosts. QQP plays
the role of transport protocol for the QRPC webservice protocol,
similar to how XML-RPC and SOAP often use HTTP over TCP as
transport protocol.
QQP is called the "Quick Queues Protocol" because it is faster
than transmitting XML data via HTTP over TCP for several reasons.
QQP is also designed to handle Internet Protocol multihoming,
hiding IP address changes from application layer software without
need for introducing an additional protocol layer for that purpose.
1. Introduction
Over the past few years, "webservices" protocols such as for example
SOAP or XML-RPC have started becoming popular. The fundamental idea
of "webservices" is to access functionality on another computer by
means of standardized multi-purpose protocols and a standardized
extensible data format. For example, when using the "webservices"
paradigm to specify a message transport system, you don't specify
the protocol and data format from scratch like it is done for SMTP in
[RFC2821] and [RFC2822]; instead you specify them in terms of a
general-purpose data format (often XML) and a general-purpose
protocol for transporting data between computers.
QQP, the Quick Queues Protocol, is such a general data transport
protocol, specifically for data in the SXDF format [SXDF]. As far
as QQP is concerned, there is no difference between webservice
requests and responses; QQP merely provides something that could be
called a "full-duplex webservice data communication channel" between
two Hosts, which both parties can use to transmit any number of
webservice requests and responses.
The data which is transmitted over QQP connections consists of
"QQP resources" which are SXDF resources consisting of an element
named Envelope (which contains QQP-related and routing information)
and an element named Data (which can contain arbitrary payload).
In particular, the Envelope contains an Element named Action which
specifies what the receiver should do with the resource.
One possible use of QQP is to use a single TCP [RFC793] connection
can be used for all webservice requests and responses between a given
pair of Hosts as long as the amount of data in each request or
response is small.
This is advantageous because of the various overheads incurred by
creating a new connection, which include
* The tree-way handshake for establishing a TCP connection; the
time required for this is bounded from below by the network's
Round-Trip Time.
* The initially slow speed of TCP connections, which is necessary
to dynamically maximize throughput without risking to overload
the network.
* For encrypted connections, the overhead of authentication and
session key negotiation.
The above-described method of using QQP over TCP is however only
intended for situations where the preferred method of sending
QQP data chunks directly as the payload of IPv6 packets is not
available, either because one of the hosts is an IPv4 host behind
NAT, or because the operating system of one of the hosts does not
provide QQP support, and the application program works around this
shortcoming by using QQP over one or more TCP connections.
Creating several separate TCP connections between the same pair
of hosts can be desirable when requests and responses which contain
large amounts of data: With separate TCP connections the transfer
of large QQP resources does not prevent the the concurrent transfer
of other data via QQP. When several TCP connections are created,
for each TCP connection there will be a "queue" of QQP resources
which await transmission via that particular TCP connection.
In the preferred situation, where the use of TCP is avoided and
the QQP resources are transmitted as chunks as the payload of IPv6
packets [RFC2460], each of the hosts which communicates via QQP
must nevertheless maintain a list of queues of QQP resources. In
each queue, QQP resources are transmitted one-after-the-other.
If the underlying network infrastructure supports QoS guarantees
which are based on "flows" in the sense of [RFC2460], QQP
implementations MAY make use of this functionality to provide
QoS guarantees to QQP-using application programs. In this case,
each [RFC2460] "flow" SHOULD be dedicated to one or more QQP
queues, and as long as the QoS guarantees of that [RFC2460]
flow are not violated, all data from the corresponding queues
SHOULD be sent exclusively via that flow.
Hosts which are not on IPv6 networks SHOULD work around that
problem by means of one of the following three methods:
(a) Encapsulating the QQP IPv6 packets in IPv4 packets by means of
the 6to4 technique defined in [RFC3056]. This methods requires
QQP support in the host's Internet Protocol Implementation, so
that the special case of such IPv4 packets which contain IPv6
QQP packets is recognized and handled appropriately.
(b) Encapsulating the QQP IPv6 packets in IPv4-based UDP datagrams,
by means of the Teredo technique defined in [RFC4380]. This
can work via a general-purpose Teredo gateway, or via a
special-purpose gateway on a QQP server listing on UDP port 26.
(c) Sending the data via a TCP connection to TCP port 26 on the
QQP server.
2. Fundamental Definitions
2.1. QQP Hosts and FQDNs
As far as the QQP protocol is concerned, internet hosts are
identified by means of fully-qualified domain names (FQDNs).
It is possible for a single physical machine to have more than one
FQDN and to use multiple FQDNs at the same time for communicating
via QQP, but as far as the QQP protocol is concerned, these
different FQDNs correspond to different (logical) hosts, called
"QQP hosts" in the following.
2.2. Communication Channels
QQP defines a "communication channel" between two hosts which is
identified by an unordered pair of fully-qualified domain names,
with each of these FQDNs identifying one of the hosts participating
in the communication channel.
2.3. ChannelID
Each QQP communication channel is characterized by a unique
ChannelID which is a 128-bit hash computed as follows from the
FQDNs of the two hosts between whom the communication channel is
defined:
A string is computed from the two FQDNs by comparing the FQDNs
alphabetically, putting that FQDN first which precedes the other
in the alphabetical order, then an ASCII LF character, then the
other FQDN, then another ASCII LF character. Then an MD5 hash
is computed of this string which consists of the two FQDNs and
the two LF characters. This MD5 hash is the ChannelID.
2.4. QQP Resources
QQP achieves its purpose by transmitting SXDF resources between
the two hosts between which the communication channel has been
defined. These SXDF resources which are transmitted by means
of QQP are also called "QQP resources". This specification
distinguishes between two types of such QQP resources, namely
"QQP control resources" and "QQP data resources". Here "QQP
data resources" are payload such as webservice requests and
responses, while "QQP control resources" are special SXDF
resources defined in section 6 of this specification.
2.5. QQP Packets
This specification defines a number of data transport methods
for transmitting QQP resources. In most of these data transport
methods, the QQP resources are embedded in IPv6 packets (which
may in turn be embedded in IPv4 packets or IPv4 UDP datagrams).
These IPv4 packets are called "QQP packets". The only exception
to this rule is data transport by means of IPv4 TCP; only in that
case QQP packets are not used because TCP allows to transmit QQP
resources directly without additional encapsulation or flow control.
2.6. Valid Data Transport Methods
The following methods of transmitting QQP resources are
considered valid data transport methods:
(a) For each "AAAA" DNS record which exists for a host's FQDN, it
is a valid data transport method to send QQP packets to the IPv6
Internet Protocol number given in that "AAAA" DNS record.
(b) For any host which is a mobile node using Mobile IPv6 as
specified in [RFC3775], it is a valid data transport method to
send QQP packets to any of its current care-of addresses.
(c) For each "A" DNS record which exists for a host's FQDN, it
is a valid data transport method to send QQP packets encapsulated
in IPv4 packets by means of the 6to4 technique defined in
[RFC3056] to the IPv4 Internet Protocol number given in that "A"
DNS record. In this case the IPv6 destination address must be
constructed using 0x0000 as SLA ID and 0x0000001A as Interface ID
(see the illustration in section 2 of [RFC3056].)
(d) For each "A" DNS record which exists for a host's FQDN, it
is a valid data transport method to send QQP packets encapsulated
in IPv4-based UDP datagrams by means of the Teredo technique
defined in [RFC4380] to the IPv4 Internet Protocol number given
in that "A" DNS record, using UDP port number 26.
(e) If no "A" or "AAAA" DNS record exists for a host's FQDN, and
QQP packages with a valid ChannelID have been received from an
IPv4 IP number and UDP port number by means of data transport
method (d), then it is a valid data transport method to send
Teredo-encapsulated QQP packets to that IPv4 IP number and UDP
port number.
(f) For each "A" DNS record which exists for a host's FQDN, it
is a valid data transport method to send QQP resources via a TCP
connection to the IPv4 Internet Protocol number given in that "A"
DNS record, using TCP port number 26.
(g) If no "A" or "AAAA" DNS record exists for a host's FQDN, and the
host has opened an IPv4 TCP connection to the local TCP port 26
and identified itself with a valid Greeting QQP control resource,
then it is a valid data transport method to send QQP resources
via that TCP connection.
QQP resources SHOULD NOT be transmitted by any other method except
the seven valid data transport methods listed above. Each QQP host
SHOULD support all of the above-defined valid data transport methods
which are applicable to its situation. This means in particular
that the burden for ensuring interoperability between IPv4 hosts and
IPv6 hosts is placed on IPv4 hosts. The complexity which is related
to the protocol transition and the data transport methods (d), (e),
(f) and (g) which provide interoperability with IPv4 hosts behind NAT
(Network Address Translation) will disappear when the transition to
IPv6 is complete.
2.7. QQP Queues and QIDs
The QQP protocol allows the concurrent transmission of multiple
QQP resources in a given direction. For this purpose, QQP data
resources are organized into "queues", each of which is identified by
an 8 bit unsigned integer number in the range from 1 to 250. This
number is called the "Queue IDentifier" or "QID". The QID values of
0, 254 and 255 have special meanings as follows: The values of 0 and
254 are used for probes and responses to probes as described in
section 5 below. The QID value of 255 is used for transmitting
QQP control resources.
The QID is specific to a logical flow of QQP resources in a given
direction. The same QID MAY also be used to identify a QQP Queue
for transmission in the other direction, that is however not
required.
Any given QQP resource is considered to be part of a single queue.
Even if QQP packets are retransmitted because they are presumed to
have been lost, or if transmission of a QQP resource is interrupted
and resumed later, the same QID MUST be used for all QQP packets
that contain data belonging to a given QQP resource. However if a
QQP resource is retransmitted in its entirety, a new QID MAY be used.
It is possible for multiple data transport methods to be used for
QQP packets belonging to the same queue.
The most significant bit of the QID indicates whether reliable
transmission of QQP Packets should be ensured by means of
acknowledgment of received packets and retransmission of lost
packets. If this bit is 0, received packets are not acknowledged
and lost packets are not retransmitted. If this bit is 1, received
packets are acknowledged and lost packets are retransmitted.
2.8. QQP Packet Numbers
Each QQP host generates packet numbers which are unsigned 32 bit
integer values for all QQP packets which it sends.
All QQP queues with QIDs from 128 to 255 share the same namespace
of packet numbers. Packet number 0 is invalid and SHOULD never be
used. Each QQP host SHOULD use packet number 1 for the first packet
it sends (this packet contains a Greeting resource, see below).
As soon as a QQP host starts sending a QQP resource, it allocates
consecutive packet numbers for all QQP packets that will be used to
transmit this QQP resource, starting with the lowest positive integer
value that has not yet been allocated to any QQP resource in the QQP
queues with QIDs from 128 to 255.
In each of the QQP queues with QIDs from 1 to 127, the packets are
simply numbered consecutively in the order in which they are sent,
starting with 1.
3. Setup, Timeout and Refreshing of QQP Communication Channels
3.1. Establishing QQP Communication Channels
The QQP communication channel is established by means of a
three-way handshake. In the case of data transmission methods (f)
and (g) described in section 2.6 above, this three-way handshake
is carried out in the TCP protocol. Other wise the following
procedure is used for the three-way handshake:
Host A sends a QQP packet to host B which contains a Greeting
without any acknowledgment. Then host B responds by sending a
QQP packet to host A which contains host B's Greeting as well
as the acknowledgment for host A's Greeting. Then host A starts
sending QQP data resources which include an acknowledgment for
host B's Greeting.
Both parties MUST wait with the transmission of QQP data resources
until until after sending their Greeting and receiving the other
party's Greeting.
Since Greetings are QQP control resources, they are always sent with
a QID of 255. Since the most significant bit of this QID is 1, it is
clear that the Greetings will be acknowledged.
Each Greeting contains an ActiveQueue field containing a QID for a
QQP queue which is established by means of the Greeting and its
acknowledgment. Hence after the initial three-way handshake, there
are two QQP queues for transmitting QQP data resources, one for each
direction.
If it should happen that both hosts simultaneously initiate the
three-way handshake, two three-way handshakes occur simultaneously.
This is not an error condition. The result is still a single QQP
communication channel, because both hosts will have computed the
same ChannelID.
3.2. Refusal of QQP Communication
Instead of acknowledging a QQP packet which contains a Greeting, a
QQP host may also respond with a QQP_NoChannel resource, see section
6.2 blow. In this case, no QQP communication channel is established.
3.3. Active Status of QQP Queues
The sending host may explicitly put a queue into inactive state
by sending a QQP_CloseQueue QQP control resource for that queue,
see section 6.3 below.
Also, Each QQP Greeting contains a TimeOut field with a value which
SHOULD NOT be greater than 24 hours. A given QQP queue SHOULD be
considered inactive if the time which has elapsed since sending the
most recent QQP Greeting for which an acknowledgment has been
exceeds the TimeOut value specified by the QQP host which is the
receiving host for that queue.
When a queue becomes inactive, the receiving host MAY discard all
QQP packets pertaining to QQP data resources in that queue which have
not been transmitted completely, even if they have already been
acknowledged.
If the sending host does not wish the receiving host to do this, it
SHOULD send a new Greeting for that queue well before the timeout.
3.4. Active Status of QQP Communication Channels
Each QQP host considers a given QQP queue to be "active" if there
is at least one active QQP Queues.
When a communication channel becomes inactive, QQP hosts MAY discard
all state information pertaining to that communication channel.
3.5. Establishing Additional QQP Queues
Additional QQP Queues may be established by sending additional
Greeting resources. Since these additional Greetings will contain
a non-zero acknowledgment field, they do not result in a repetition
of the three-way handshake for establishing QQP communication
channels.
4. QQP Packet Format
QQP packets consist of a header and payload. The header consists
of 256 bits as follows:
128 bit 32bit 16b 16b 32bit 32bit
+-----------------------------+-----------------------------+
|ChannelID | PCKID|QID|PC | ACK | RTRQ |
+-----------------------------+-----------------------------+
The meaning of the fields is as follows:
ChannelID is as defined in section 2.3 above
PCKID ("PaCKage IDentifier) is the package number defined in
section 2.8 above.
QID is as defined in section 2.7 above.
PC is a "package count" of the QQP packages for the same
QQP resource which will follow after the present package.
If this is the only package or the last of a number of
packages used to transmit a QQP resource, this field is zero.
The ACK (ACKnowledgement) field gives the lowest package number
up to which all of the other party's packages have been received.
If the RTRQ (ReTransmission ReQuest) field is non-zero, that
indicates a request to retransmit the package with the
indicated package number.
The size of the payload is determined from the payload size of
the IPv6 packet in which the QQP packet is encapsulated.
If multiple packages are used to transmit a single QQP resource,
then with the possible exception of the last of these packages,
they MUST all have the same size. The last of these packages
MAY be shorter, but it MUST NOT be longer.
5. Probing
This section is still mostly TODO. The basic idea is to send a
test packet with QID of 254 multiple times to the recipient, using
different paths and packet sizes. This test packet specifies how
long the recipient should wait for further copies after the first
copy has been received. Each copy of the packet has a unique
identifier, say in the range from 0 to 255. Then the recipient of
the test packets sends back an array indicating which of the test
packets arrived, and if so how much later than the first copy of
the test packet.
6. QQP Control Resources
6.1. The QQP_Greeting Resource
The Greeting is a signed SXDF resource containing a single dictionary
named QQP_Greeting with values for the following fields, all of which
are required:
TimeStamp - The current time, in seconds since the beginning
of the year 1970.
MySourceAddress - IP Address from which this Greeting is sent.
MaxResourceSize - A limit on the size of data items (which are QQP
resources) that the Host which generated the
Greeting will accept.
MaxBufferSize - The sending host should assume that no more than
this amount of memory is available for buffering
incompletely-transmitted packets until their
transmission is complete.
MaxQueues - The other host should not send more than this
number of data streams simultaneously.
MaxSustainedRate - Maximal sustained transmission data rate that
the host which generated the Greeting expects to
be able to process.
MaxBurstRate - Maximal transmission data rate that the host
which generated the Greeting expects to be able
to process during bursts of data.
MaxBurstSize - Maximal size of such bursts, in bytes.
MinMaxBurstPause - Minimal pause between two bursts of maximal size
TimeOut - The TimeOut value discussed in section 3.3 above
ActiveQueue - A QID for a queue which is made or kept active,
see section 3.1 above.
ExceptionsTo - A qrpc: URL where QRPC Exception resources
with information about error conditions will be
received. See section 8 for information on the
format of such Exception resources.
If the QQP host which receives this Greeting trusts the authenticity
of the key that the Greeting is signed with, it SHOULD accept QQP
packages coming from the IP address given in MySourceAddress until 24
hours after the time given in the TimeStamp. The security
implications of this mechanism are discussed in section 9 below.
The relationship between the size of bursts of non-maximal size and
the pause which is required between such bursts is intended to be
calculated by means of the token bucket algorithm with parameters
corresponding to the values of MaxSustainedRate, MaxBurstSize and
MinMaxBurstPause.
6.2. The QQP_NoChannel Resource
The NoChannel resource is a QQP resource containing a single integer
value named QQP_NoChannel. The value indicates a timespan in seconds
which the other host should wait before attempting again to establish
a QQP communication channel.
6.3. The QQP_CloseQueue Resource
The QQP_CloseQueue resource is a QQP resource containing a single
integer value named QQP_CloseQueue. Its value is a QID of a queue
which is being closed; by sending this control resource, the sending
host for this queue indicates that it intends to send no more data
with the specified QID in the foreseeable future.
7. Format of QQP Data Resources
QQP data resources resources consist of two elements named Envelope
and Contents:
An element named Envelope MUST be present; it SHOULD contain at least
an Action element and an ExceptionsTo element. It MAY also contain a
ResponseTo element.
An element named Contents SHOULD also be present; it may contain
arbitrary SXDF data. For example the Contents element MAY contain
human-readable data in SXDF format, or its value MAY be merely a
string of length zero, or its value MAY be a string containing
encrypted data.
A digital signature as described in section 6 of [SXDF] MAY be
present; in this case the _DATA element which holds the signed data
SHOULD contain both the Envelope and the Contents elements.
7.1. Envelope Elements
7.1.1. Action Element
Sender SHOULD ensure that each QQP resource which it transmits
contains an Action element with a value which is a valid URL.
7.1.2. ExceptionsTo Element
The ExceptionsTo element specifies an qrpc: URL to which QRPC
Exception resources related to the present QQP resource should be
sent.
7.1.3. ResponseTo Element
If present, the optional ResponseTo Element specifies the URL to
which the specified Action will cause a response to be sent. If it
is known that currently no data can be sent to this URL, the receiver
of the resource MAY send a QRPC Exception resource to the
ExceptionsTo URL instead of executing the requested Action.
7.2. Contents Element
The precise format of the Contents element is not specified here,
as it is irrelevant to QQP implementations. In fact the Contents
element MAY contain encrypted binary data.
8. Format of Exception resources.
This section is still TODO.
9. Security Considerations
Of course digital signature SHOULD be used in all QQP Data Resources
where protecting the integrity of the data is important. However
this does not protect against the possible disruption of QQP
communication channels by hostile third parties.
The QQP protocol relies on IP addresses for protecting QQP
communication channels against disruption or manipulation by
third parties. These network segments SHOULD therefore be protected
by means of packet filters which prevent unauthorized third parties
from injecting forged QQP packets.
Also, these IP addresses are trusted for 24 hours after the
time of the TimeStamp in the Greeting. Therefore, the use of
IP addresses which could possibly come under the control of hostile
third parties before 24 hours have elapsed SHOULD be avoided.
10. IANA Considerations
This specification has no requests for IANA.
References
Normative References
[RFC793] POSTEL, J. (Ed.): Transmission Control Protocol
RFC 793, September 1981.
[RFC1738] Berners-Lee, T., Masinter, L., McCahill, M.,
Eds., "Uniform Resource Locators", RFC 1738.
[SXDF] Bollow, N., "SXDF - Simple Extensible Data
Format", work in progress.
<http://SXDF.org/>
[QRPC] Bollow, N., "QRPC - Queueable Remote Procedure
Calls", work in progress.
<http://QRPC.org/>
[KEYWORDS] Bradner, S., "Key words for use in RFCs to
Indicate Requirement Levels", BCP 14, RFC 2119,
March 1997.
[RFC2440] Callas, J., Donnerhacke, L., Finney, H.,
Thayer, R. "OpenPGP Message Format", RFC 2440
[RFC3056] Carpenter, B., Moore, K.: Connection of IPv6
Domains via IPv4 Clouds, RFC 3056, February 2001.
[RFC2460] Deering, S., Hinden, R.: Internet Protocol,
Version 6 (IPv6) Specification, RFC 2460,
December 1998.
[RFC4380] Huitema, C.: Teredo: Tunneling IPv6 over UDP
through Network Address Translations (NATs).
RFC 4380, February 2006.
Informative References
[RFC3775] Johnson, D., Perkins, C., Arkko, J.:
Mobility Support in IPv6, RFC 3775, June 2004.
[RFC2821] Klensin, J., Ed., "Simple Mail Transfer
Protocol", RFC 2821.
[RFC2822] Resnick, P., Ed., "Internet message format",
RFC 2822.
Authors' Address
Norbert Bollow
Weidlistrasse 18
CH-8624 Gruet
Phone: +41 44 972 2059
EMail: nb@bollow.ch
Full Copyright Statement
Copyright (C) The Internet Society (2006).
This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.
This document and the information contained herein are provided on
an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE
REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND
THE INTERNET ENGINEERING TASK FORCE DISCLAIM 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.
Intellectual Property Statement
The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at
ietf-ipr@ietf.org.
Acknowledgment
Funding for the RFC Editor function is currently provided by the
Internet Society.