Table of Contents Previous Next
Logo
The Ice Protocol : 38.4 Compression
Copyright © 2003-2009 ZeroC, Inc.

38.4 Compression

Compression is an optional feature of the Ice protocol; whether it is used for a particular message is determined by several factors:
1. Compression may not be supported on all platforms or in all language mappings.
2. Compression can be used in a request or batch request only if the endpoint advertises the ability to accept compressed messages (see Section 38.2.13).
3. For efficiency reasons, the Ice protocol engine does not compress messages smaller than 100 bytes.1
If compression is used, the entire message excluding the header is compressed using the bzip2 algorithm [16]. The messageSize member of the message header therefore reflects the size of the compressed message, including the uncompressed header, plus an additional four bytes (see page 1270).
The compressionStatus field of the message header (see Section 38.3.1) indicates whether a message is compressed and whether the sender can accept a compressed reply, as shown in Table 38.18.
Message is uncompressed, sender cannot accept a compressed reply.
Request, Batch Request, Reply, Validate Connection, Close Connection
Message is uncompressed, sender can accept a compressed reply.
Message is compressed and sender can accept a compressed reply
• A compression status of 0 indicates that the message is not compressed and, moreover, that the sender of this message cannot accept a compressed reply. A client that does not support compression always uses this value. A client that supports compression sets the value to 0 if the endpoint via which the request is dispatched indicates that it does not support compression.
A server uses this value for uncompressed replies.
• A compression status of 1 indicates that the message is not compressed, but that the server should return a compressed reply (if any). A client uses this value if the endpoint via which the request is dispatched indicates that it supports compression, but the client has decided not to use compression for this particular request (presumably because the request is too small, so compression does not provide any saving).
This value applies only to request and batch request messages.
• A compression status of 2 indicates that the message is compressed and that the server is free to reply with a compressed message (but need not reply with a compressed message). A client that supports compression (obviously) sets this value only if the endpoint via which the request is dispatched indicates that it supports compression.
A server uses this value for compressed replies.
The message body of a compressed request, batch request, or reply message is encoded by first writing the size of the uncompressed message (including its header) as four-byte integer, followed by the compressed message body (excluding the header). It follows that the size of a compressed message is 14 bytes for the header, plus four bytes to record the size of the uncompressed message, plus the number of bytes occupied by the compressed message body (encoded as specified in Sections 38.3.2 through 38.3.4). Writing the uncompressed message size prior to the body enables the receiver to allocate a buffer that is large enough to accomodate the uncompressed message body.
Note that compression is likely to improve performance only over lower-speed links, for which bandwidth is the overall limiting factor. Over high-speed LAN links, the CPU time spent on compressing and uncompressing messages is longer than the time it takes to just send the uncompressed data.

1
A compliant implementation of the protocol is free to compress messages that are smaller than 100 bytes—the choice is up to the protocol implementation.

Table of Contents Previous Next
Logo