Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
Grpc
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
tci-gateway-module
Grpc
Commits
3165ff3d
Commit
3165ff3d
authored
9 years ago
by
David Garcia Quintas
Browse files
Options
Downloads
Patches
Plain Diff
Added compression spec
parent
3b1a3f9f
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
doc/PROTOCOL-HTTP2.md
+2
-2
2 additions, 2 deletions
doc/PROTOCOL-HTTP2.md
doc/compression.md
+105
-0
105 additions, 0 deletions
doc/compression.md
with
107 additions
and
2 deletions
doc/PROTOCOL-HTTP2.md
+
2
−
2
View file @
3165ff3d
...
@@ -38,7 +38,7 @@ Request-Headers are delivered as HTTP2 headers in HEADERS + CONTINUATION frames.
...
@@ -38,7 +38,7 @@ Request-Headers are delivered as HTTP2 headers in HEADERS + CONTINUATION frames.
*
**Nanosecond**
→ "n"
*
**Nanosecond**
→ "n"
*
**Content-Type**
→ "content-type" "application/grpc" [("+proto" / "+json" / {_custom_})]
*
**Content-Type**
→ "content-type" "application/grpc" [("+proto" / "+json" / {_custom_})]
*
**Content-Coding**
→ "identity" / "gzip" / "deflate" / "snappy" / {_custom_}
*
**Content-Coding**
→ "identity" / "gzip" / "deflate" / "snappy" / {_custom_}
*
**Message-Encoding**
→ "grpc-encoding" Content-Coding
*
<a
name=
"message-encoding"
></a>
**Message-Encoding**
→ "grpc-encoding" Content-Coding
*
**Message-Accept-Encoding**
→ "grpc-accept-encoding" Content-Coding
\*
("," Content-Coding)
*
**Message-Accept-Encoding**
→ "grpc-accept-encoding" Content-Coding
\*
("," Content-Coding)
*
**User-Agent**
→ "user-agent" {_structured user-agent string_}
*
**User-Agent**
→ "user-agent" {_structured user-agent string_}
*
**Message-Type**
→ "grpc-message-type" {_type name for message schema_}
*
**Message-Type**
→ "grpc-message-type" {_type name for message schema_}
...
@@ -83,7 +83,7 @@ binary values' lengths being post-Base64.
...
@@ -83,7 +83,7 @@ binary values' lengths being post-Base64.
The repeated sequence of
**Length-Prefixed-Message**
items is delivered in DATA frames
The repeated sequence of
**Length-Prefixed-Message**
items is delivered in DATA frames
*
**Length-Prefixed-Message**
→ Compressed-Flag Message-Length Message
*
**Length-Prefixed-Message**
→ Compressed-Flag Message-Length Message
*
**Compressed-Flag**
→ 0 / 1 # encoded as 1 byte unsigned integer
*
<a
name=
"compressed-flag"
></a>
**Compressed-Flag**
→ 0 / 1 # encoded as 1 byte unsigned integer
*
**Message-Length**
→ {_length of Message_} # encoded as 4 byte unsigned integer
*
**Message-Length**
→ {_length of Message_} # encoded as 4 byte unsigned integer
*
**Message**
→
\*
{binary octet}
*
**Message**
→
\*
{binary octet}
...
...
This diff is collapsed.
Click to expand it.
doc/compression.md
0 → 100644
+
105
−
0
View file @
3165ff3d
## **gRPC Compression**
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in
[
RFC 2119
](
http://www.ietf.org/rfc/rfc2119.txt
)
.
### Intent
Compression is used to reduce the amount of bandwidth used between peers. The
compression supported by gRPC acts _at the individual message level_, taking
_message_
[
as defined in the wire format
document
](
PROTOCOL-HTTP2.md
)
.
The implementation supports different compression algorithms. A _default
compression level_, to be used in the absence of message-specific settings, MAY
be specified for during channel creation.
The ability to control compression settings per call and to enable/disable
compression on a per message basis MAY be used to prevent CRIME/BEAST attacks.
It also allows for asymmetric compression communication, whereby a response MAY
be compressed differently, if at all.
### Specification
Compression MAY be configured by the Client Application by calling the
appropriate API method. There are two scenarios where compression MAY be
configured:
+
At channel creation time, which sets the channel default compression and
therefore the compression that SHALL be used in the absence of per-RPC
compression configuration.
+
At response time, via:
+
For unary RPCs, the {Client,Server}Context instance.
+
For streaming RPCs, the {Client,Server}Writer instance. In this case,
configuration is reduced to disabling compression altogether.
### Compression Method Asymmetry Between Peers
A gRPC peer MAY choose to respond using a different compression method to that
of the request, including not performing any compression, regardless of channel
and RPC settings (for example, if compression would result in small or negative
gains).
A compressed message from a client with an algorithm unsupported by a server,
WILL result in an INVALID
\_
ARGUMENT error, alongside the receiving peer's
`grpc-accept-encoding`
header specifying the algorithms it accepts. If an
INTERNAL error is returned from the server despite having used one of the
algorithms from the
`grpc-accept-encoding h`
eader, the cause MUST NOT be related
to compression. Data sent from a server compressed with an algorithm not
supported by the client will also result in an INTERNAL error.
Note that a peer MAY choose to not disclose all the encodings it supports.
However, if it receives a message compressed in an undisclosed but supported
encoding, it MUST include said encoding in the response's
`grpc-accept-encoding
h`
eader.
For every message a server is requested to compress using an algorithm it knows
the client doesn't support (as indicated by the last
`grpc-accept-encoding`
header received from the client), it SHALL send the message uncompressed.
### Specific Disabling of Compression
If the user (through the previously described mechanisms) requests to disable
compression the next message MUST be sent uncompressed. This is instrumental in
preventing BEAST/CRIME attacks. This applies to both the the unary and streaming
cases.
### Compression Levels and Algorithms
We currently (as of July 2015) support _gzip_ and _deflate_ as algorithms (with
the possible future addition of snappy). In order to simplify the public API,
it's intended to abstract the algorithms as _compression levels_ (such as "low",
"medium", "high") that'd map to concrete algorithms and/or their settings (such
as "low" mapping to "gzip -3" and "high" mapping to "gzip -9"). However, we
can't presently (July 2015) implement said compression levels at the client side
without either a initial negotiation of capabilities or an automatic retry
mechanism. Therefore, compression levels are only supported at the server side,
which is aware of the client's capabilities by virtue of the incoming
Message-Accept-Encoding header.
### Propagation to child RPCs
The inheritance of the compression configuration by child RPCs is left up to the
implementation. Note that in the absence of changes to the parent channel, its
configuration will be used.
### Test cases
1.
When a compression level is not specified for either the channel or the
message, the default channel level _none_ is considered: data MUST NOT be
compressed.
1.
When per-RPC compression configuration isn't present for a message, the
channel compression configuration MUST be used.
1.
When a compression method (including no compression) is specified for an
outgoing message, the message MUST be compressed accordingly.
1.
A message compressed in a way not supported by its endpoint MUST fail with
INVALID
\_
ARGUMENT status, its associated description indicating the unsupported
condition as well as the supported ones. The returned
`grpc-accept-encoding`
header MUST NOT contain the compression method (encoding) used.
1.
An ill-constructed message with its
[
Compressed-Flag
bit
](
PROTOCOL-HTTP2.md#compressed-flag
)
set but lacking a
"
[
grpc-encoding
](
PROTOCOL-HTTP2.md#message-encoding
)
"
entry different from _identity_ in its metadata MUST fail with INTERNAL status,
its associated description indicating the invalid Compressed-Flag condition.
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment