123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- Network Working Group A. Gulbrandsen
- Request for Comments: 4978 Oryx Mail Systems GmbH
- Category: Standards Track August 2007
- The IMAP COMPRESS Extension
- Status of this Memo
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
- Abstract
- The COMPRESS extension allows an IMAP connection to be effectively
- and efficiently compressed.
- Table of Contents
- 1. Introduction and Overview .......................................2
- 2. Conventions Used in This Document ...............................2
- 3. The COMPRESS Command ............................................3
- 4. Compression Efficiency ..........................................4
- 5. Formal Syntax ...................................................6
- 6. Security Considerations .........................................6
- 7. IANA Considerations .............................................6
- 8. Acknowledgements ................................................7
- 9. References ......................................................7
- 9.1. Normative References .......................................7
- 9.2. Informative References .....................................7
- Gulbrandsen Standards Track [Page 1]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- 1. Introduction and Overview
- A server which supports the COMPRESS extension indicates this with
- one or more capability names consisting of "COMPRESS=" followed by a
- supported compression algorithm name as described in this document.
- The goal of COMPRESS is to reduce the bandwidth usage of IMAP.
- Compared to PPP compression (see [RFC1962]) and modem-based
- compression (see [MNP] and [V42BIS]), COMPRESS offers much better
- compression efficiency. COMPRESS can be used together with Transport
- Security Layer (TLS) [RFC4346], Simple Authentication and Security
- layer (SASL) encryption, Virtual Private Networks (VPNs), etc.
- Compared to TLS compression [RFC3749], COMPRESS has the following
- (dis)advantages:
- - COMPRESS can be implemented easily both by IMAP servers and
- clients.
- - IMAP COMPRESS benefits from an intimate knowledge of the IMAP
- protocol's state machine, allowing for dynamic and aggressive
- optimization of the underlying compression algorithm's parameters.
- - When the TLS layer implements compression, any protocol using that
- layer can transparently benefit from that compression (e.g., SMTP
- and IMAP). COMPRESS is specific to IMAP.
- In order to increase interoperation, it is desirable to have as few
- different compression algorithms as possible, so this document
- specifies only one. The DEFLATE algorithm (defined in [RFC1951]) is
- standard, widely available and fairly efficient, so it is the only
- algorithm defined by this document.
- In order to increase interoperation, IMAP servers that advertise this
- extension SHOULD also advertise the TLS DEFLATE compression mechanism
- as defined in [RFC3749]. IMAP clients MAY use either COMPRESS or TLS
- compression, however, if the client and server support both, it is
- RECOMMENDED that the client choose TLS compression.
- The extension adds one new command (COMPRESS) and no new responses.
- 2. Conventions Used in This Document
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in [RFC2119].
- Formal syntax is defined by [RFC4234] as modified by [RFC3501].
- Gulbrandsen Standards Track [Page 2]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- In the examples, "C:" and "S:" indicate lines sent by the client and
- server respectively. "[...]" denotes elision.
- 3. The COMPRESS Command
- Arguments: Name of compression mechanism: "DEFLATE".
- Responses: None
- Result: OK The server will compress its responses and expects the
- client to compress its commands.
- NO Compression is already active via another layer.
- BAD Command unknown, invalid or unknown argument, or COMPRESS
- already active.
- The COMPRESS command instructs the server to use the named
- compression mechanism ("DEFLATE" is the only one defined) for all
- commands and/or responses after COMPRESS.
- The client MUST NOT send any further commands until it has seen the
- result of COMPRESS. If the response was OK, the client MUST compress
- starting with the first command after COMPRESS. If the server
- response was BAD or NO, the client MUST NOT turn on compression.
- If the server responds NO because it knows that the same mechanism is
- active already (e.g., because TLS has negotiated the same mechanism),
- it MUST send COMPRESSIONACTIVE as resp-text-code (see [RFC3501],
- Section 7.1), and the resp-text SHOULD say which layer compresses.
- If the server issues an OK response, the server MUST compress
- starting immediately after the CRLF which ends the tagged OK
- response. (Responses issued by the server before the OK response
- will, of course, still be uncompressed.) If the server issues a BAD
- or NO response, the server MUST NOT turn on compression.
- For DEFLATE (as for many other compression mechanisms), the
- compressor can trade speed against quality. When decompressing there
- isn't much of a tradeoff. Consequently, the client and server are
- both free to pick the best reasonable rate of compression for the
- data they send.
- When COMPRESS is combined with TLS (see [RFC4346]) or SASL (see
- [RFC4422]) security layers, the sending order of the three extensions
- MUST be first COMPRESS, then SASL, and finally TLS. That is, before
- data is transmitted it is first compressed. Second, if a SASL
- security layer has been negotiated, the compressed data is then
- signed and/or encrypted accordingly. Third, if a TLS security layer
- has been negotiated, the data from the previous step is signed and/or
- Gulbrandsen Standards Track [Page 3]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- encrypted accordingly. When receiving data, the processing order
- MUST be reversed. This ensures that before sending, data is
- compressed before it is encrypted, independent of the order in which
- the client issues COMPRESS, AUTHENTICATE, and STARTTLS.
- The following example illustrates how commands and responses are
- compressed during a simple login sequence:
- S: * OK [CAPABILITY IMAP4REV1 STARTTLS COMPRESS=DEFLATE]
- C: a starttls
- S: a OK TLS active
- From this point on, everything is encrypted.
- C: b login arnt tnra
- S: b OK Logged in as arnt
- C: c compress deflate
- S: d OK DEFLATE active
- From this point on, everything is compressed before being
- encrypted.
- The following example demonstrates how a server may refuse to
- compress twice:
- S: * OK [CAPABILITY IMAP4REV1 STARTTLS COMPRESS=DEFLATE]
- [...]
- C: c compress deflate
- S: c NO [COMPRESSIONACTIVE] DEFLATE active via TLS
- 4. Compression Efficiency
- This section is informative, not normative.
- IMAP poses some unusual problems for a compression layer.
- Upstream is fairly simple. Most IMAP clients send the same few
- commands again and again, so any compression algorithm that can
- exploit repetition works efficiently. The APPEND command is an
- exception; clients that send many APPEND commands may want to
- surround large literals with flushes in the same way as is
- recommended for servers later in this section.
- Downstream has the unusual property that several kinds of data are
- sent, confusing all dictionary-based compression algorithms.
- Gulbrandsen Standards Track [Page 4]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- One type is IMAP responses. These are highly compressible; zlib
- using its least CPU-intensive setting compresses typical responses to
- 25-40% of their original size.
- Another type is email headers. These are equally compressible, and
- benefit from using the same dictionary as the IMAP responses.
- A third type is email body text. Text is usually fairly short and
- includes much ASCII, so the same compression dictionary will do a
- good job here, too. When multiple messages in the same thread are
- read at the same time, quoted lines etc. can often be compressed
- almost to zero.
- Finally, attachments (non-text email bodies) are transmitted, either
- in binary form or encoded with base-64.
- When attachments are retrieved in binary form, DEFLATE may be able to
- compress them, but the format of the attachment is usually not IMAP-
- like, so the dictionary built while compressing IMAP does not help.
- The compressor has to adapt its dictionary from IMAP to the
- attachment's format, and then back. A few file formats aren't
- compressible at all using deflate, e.g., .gz, .zip, and .jpg files.
- When attachments are retrieved in base-64 form, the same problems
- apply, but the base-64 encoding adds another problem. 8-bit
- compression algorithms such as deflate work well on 8-bit file
- formats, however base-64 turns a file into something resembling 6-bit
- bytes, hiding most of the 8-bit file format from the compressor.
- When using the zlib library (see [RFC1951]), the functions
- deflateInit2(), deflate(), inflateInit2(), and inflate() suffice to
- implement this extension. The windowBits value must be in the range
- -8 to -15, or else deflateInit2() uses the wrong format.
- deflateParams() can be used to improve compression rate and resource
- use. The Z_FULL_FLUSH argument to deflate() can be used to clear the
- dictionary (the receiving peer does not need to do anything).
- A client can improve downstream compression by implementing BINARY
- (defined in [RFC3516]) and using FETCH BINARY instead of FETCH BODY.
- In the author's experience, the improvement ranges from 5% to 40%
- depending on the attachment being downloaded.
- A server can improve downstream compression if it hints to the
- compressor that the data type is about to change strongly, e.g., by
- sending a Z_FULL_FLUSH at the start and end of large non-text
- literals (before and after '*CHAR8' in the definition of literal in
- RFC 3501, page 86). Small literals are best left alone. A possible
- boundary is 5k.
- Gulbrandsen Standards Track [Page 5]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- A server can improve the CPU efficiency both of the server and the
- client if it adjusts the compression level (e.g., using the
- deflateParams() function in zlib) at these points, to avoid trying to
- compress incompressible attachments. A very simple strategy is to
- change the level to 0 at the start of a literal provided the first
- two bytes are either 0x1F 0x8B (as in deflate-compressed files) or
- 0xFF 0xD8 (JPEG), and to keep it at 1-5 the rest of the time. More
- complex strategies are possible.
- 5. Formal Syntax
- The following syntax specification uses the Augmented Backus-Naur
- Form (ABNF) notation as specified in [RFC4234]. This syntax augments
- the grammar specified in [RFC3501]. [RFC4234] defines SP and
- [RFC3501] defines command-auth, capability, and resp-text-code.
- Except as noted otherwise, all alphabetic characters are case-
- insensitive. The use of upper or lower case characters to define
- token strings is for editorial clarity only. Implementations MUST
- accept these strings in a case-insensitive fashion.
- command-auth =/ compress
- compress = "COMPRESS" SP algorithm
- capability =/ "COMPRESS=" algorithm
- ;; multiple COMPRESS capabilities allowed
- algorithm = "DEFLATE"
- resp-text-code =/ "COMPRESSIONACTIVE"
- Note that due the syntax of capability names, future algorithm names
- must be atoms.
- 6. Security Considerations
- As for TLS compression [RFC3749].
- 7. IANA Considerations
- The IANA has added COMPRESS=DEFLATE to the list of IMAP capabilities.
- Gulbrandsen Standards Track [Page 6]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- 8. Acknowledgements
- Eric Burger, Dave Cridland, Tony Finch, Ned Freed, Philip Guenther,
- Randall Gellens, Tony Hansen, Cullen Jennings, Stephane Maes, Alexey
- Melnikov, Lyndon Nerenberg, and Zoltan Ordogh have all helped with
- this document.
- The author would also like to thank various people in the rooms at
- meetings, whose help is real, but not reflected in the author's
- mailbox.
- 9. References
- 9.1. Normative References
- [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification
- version 1.3", RFC 1951, May 1996.
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
- [RFC3501] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION
- 4rev1", RFC 3501, March 2003.
- [RFC4234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
- Specifications: ABNF", RFC 4234, October 2005.
- 9.2. Informative References
- [RFC1962] Rand, D., "The PPP Compression Control Protocol (CCP)",
- RFC 1962, June 1996.
- [RFC3516] Nerenberg, L., "IMAP4 Binary Content Extension", RFC 3516,
- April 2003.
- [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol
- Compression Methods", RFC 3749, May 2004.
- [RFC4346] Dierks, T. and E. Rescorla, "The Transport Layer Security
- (TLS) Protocol Version 1.1", RFC 4346, April 2006.
- [RFC4422] Melnikov, A. and K. Zeilenga, "Simple Authentication and
- Security Layer (SASL)", RFC 4422, June 2006.
- [V42BIS] ITU, "V.42bis: Data compression procedures for data
- circuit-terminating equipment (DCE) using error correction
- procedures", http://www.itu.int/rec/T-REC-V.42bis, January
- 1990.
- Gulbrandsen Standards Track [Page 7]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- [MNP] Gilbert Held, "The Complete Modem Reference", Second
- Edition, Wiley Professional Computing, ISBN 0-471-00852-4,
- May 1994.
- Author's Address
- Arnt Gulbrandsen
- Oryx Mail Systems GmbH
- Schweppermannstr. 8
- D-81671 Muenchen
- Germany
- Fax: +49 89 4502 9758
- EMail: arnt@oryx.com
- Gulbrandsen Standards Track [Page 8]
- RFC 4978 The IMAP COMPRESS Extension August 2007
- Full Copyright Statement
- Copyright (C) The IETF Trust (2007).
- 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, THE IETF TRUST 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
- 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.
- Gulbrandsen Standards Track [Page 9]
|