5.8.7. CRC coverage for extension headers
All fields of extension headers are CRC-STATIC, with the following
exceptions which are CRC-DYNAMIC.
1) Entire AH header.
2) Entire ESP header.
3) Sequence number in GRE, Checksum in GRE
----------------------------------------------------------------[Page 124]
5.9. Header compression CRCs, coverage and polynomials
This chapter describes how to calculate the CRCs used in packet
headers defined in this document. (Note that another type of CRC is
defined for reconstructed units in section 5.2.5.)
5.9.1. IR and IR-DYN packet CRCs
The CRC in the IR and IR-DYN packet is calculated over the entire IR
or IR-DYN packet, excluding Payload and including CID or any Add-CID
octet. For purposes of computing the CRC, the CRC field in the
header is set to zero.
The initial content of the CRC register is to be preset to all 1's.
The CRC polynomial to be used for the 8-bit CRC is:
C(x) = 1 + x + x^2 + x^8
5.9.2. CRCs in compressed headers
The CRC in compressed headers is calculated over all octets of the
entire original header, before compression, in the following manner.
The octets of the header are classified as either CRC-STATIC or CRC-
DYNAMIC, and the CRC is calculated over:
1) the concatenated CRC-STATIC octets of the original header, placed
in the same order as they appear in the original header, followed
by
2) the concatenated CRC-DYNAMIC octets of the original header, placed
in the same order as they appear in the original header.
The intention is that the state of the CRC computation after 1) will
be saved. As long as the CRC-STATIC octets do not change, the CRC
calculation will then only need to process the CRC-DYNAMIC octets.
In a typical RTP/UDP/IPv4 header, 25 octets are CRC-STATIC and 15 are
CRC-DYNAMIC. In a typical RTP/UDP/IPv6 header, 49 octets are CRC-
STATIC and 11 are CRC-DYNAMIC. This technique will thus reduce the
computational complexity of the CRC calculation by roughly 60% for
RTP/UDP/IPv4 and by roughly 80% for RTP/UDP/IPv6.
Note: Whenever the CRC-STATIC fields change, the new saved CRC state
after 1) is compared with the old state. If the states are
identical, the CRC cannot catch the error consisting in the
decompressor not having updated the static context. In U/O-mode the
----------------------------------------------------------------[Page 125]
compressor SHOULD then for a while use packet types with another CRC
length, for which there is a difference in CRC state, to ensure error
detection.
The initial content of the CRC register is preset to all 1's.
The polynomial to be used for the 3 bit CRC is:
C(x) = 1 + x + x^3
The polynomial to be used for the 7 bit CRC is:
C(x) = 1 + x + x^2 + x^3 + x^6 + x^7
The CRC in compressed headers is calculated over the entire original
header, before compression.
5.10. ROHC UNCOMPRESSED -- no compression (Profile 0x0000)
In ROHC, compression has not been defined for all kinds of IP
headers. Profile 0x0000 provides a way to send IP packets without
compressing them. This can be used for IP fragments, RTCP packets,
and in general for any packet for which compression of the header has
not been defined, is not possible due to resource constraints, or is
not desirable for some other reason.
After initialization, the only overhead for sending packets using
Profile 0x0000 is the size of the CID. When uncompressed packets are
frequent, Profile 0x0000 should be associated with a CID with size
zero or one octet. There is no need to associate Profile 0x0000 with
more than one CID.
5.10.1. IR packet
The initialization packet (IR packet) for Profile 0x0000 has the
following format:
----------------------------------------------------------------[Page 126]
0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- ---
: Add-CID octet : if for small CIDs and (CID != 0)
+---+---+---+---+---+---+---+---+
| 1 1 1 1 1 1 0 |res|
+---+---+---+---+---+---+---+---+
: :
/ 0-2 octets of CID info / 1-2 octets if for large CIDs
: :
+---+---+---+---+---+---+---+---+
| Profile = 0 | 1 octet
+---+---+---+---+---+---+---+---+
| CRC | 1 octet
+---+---+---+---+---+---+---+---+
: : (optional)
/ IP packet / variable length
: :
--- --- --- --- --- --- --- ---
res: Always zero.
Profile: 0.
CRC: 8-bit CRC, computed using the polynomial of section 5.9.1.
The CRC covers the first octet of the IR packet through the
Profile octet of the IR packet, i.e., it does not cover the
CRC itself or the IP packet.
IP packet: An uncompressed IP packet may be included in the IR
packet. The decompressor determines if the IP packet is
present by considering the length of the IR packet.
5.10.2. Normal packet
A Normal packet is a normal IP packet plus CID information. When the
channel uses small CIDs, and profile 0x0000 is associated with a CID
> 0, an Add-CID octet is prepended to the IP packet. When the
channel uses large CIDs, the CID is placed so that it starts at the
second octet of the Normal packet.
----------------------------------------------------------------[Page 127]
0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- ---
: Add-CID octet : if for small CIDs and (CID != 0)
+---+---+---+---+---+---+---+---+
| first octet of IP packet |
+---+---+---+---+---+---+---+---+
: :
/ 0-2 octets of CID info / 1-2 octets if for large CIDs
: :
+---+---+---+---+---+---+---+---+
| |
/ rest of IP packet / variable length
| |
+---+---+---+---+---+---+---+---+
Note that the first octet of the IP packet starts with the bit
pattern 0100 (IPv4) or 0110 (IPv6). This does not conflict with any
reserved packet types. Hence, no bits in addition to the CID are
needed. The profile is reasonably future-proof since problems do not
occur until IP version 14.
5.10.3. States and modes
There are two modes in Profile 0x0000: Unidirectional mode and
Bidirectional mode. In Unidirectional mode, the compressor repeats
the IR packet periodically. In Bidirectional mode, the compressor
never repeats the IR packet. The compressor and decompressor always
start in Unidirectional mode. Whenever feedback is received, the
compressor switches to Bidirectional mode.
The compressor can be in either of two states: the IR state or the
Normal state. It starts in the IR state.
a) IR state: Only IR packets can be sent. After sending a small
number of IR packets (only one when refreshing), the compressor
switches to the Normal state.
b) Normal state: Only Normal packets can be sent. When in
Unidirectional mode, the compressor periodically transits back to
the IR state. The length of the period is implementation
dependent, but should be fairly long. Exponential backoff may be
used.
c) When feedback is received in any state, the compressor switches to
Bidirectional mode.
----------------------------------------------------------------[Page 128]
The decompressor can be in either of two states: NO_CONTEXT or
FULL_CONTEXT. It starts in NO_CONTEXT.
d) When an IR packet is received in the NO_CONTEXT state, the
decompressor first verifies the packet using the CRC. If the
packet is OK, the decompressor 1) moves to the FULL_CONTEXT state,
2) delivers the IP packet to upper layers if present, 3) MAY send
an ACK. If the packet is not OK, it is discarded without further
action.
e) When any other packet is received in the NO_CONTEXT state, it is
discarded without further action.
f) When an IR packet is received in the FULL_CONTEXT state, the
packet is first verified using the CRC. If OK, the decompressor
1) delivers the IP packet to upper layers if present, 2) MAY send
an ACK. If the packet is not OK, no action is taken.
g) When a Normal packet is received in the FULL_CONTEXT state, the
CID information is removed and the IP packet is delivered to upper
layers.
5.10.4. Feedback
The only kind of feedback in Profile 0x0000 is ACKs. Profile 0x0000
MUST NOT be rejected. Profile 0x0000 SHOULD be associated with at
most one CID. ACKs use the FEEDBACK-1 format of section 5.2. The
value of the profile-specific octet in the FEEDBACK-1 ACK is 0
(zero).
5.11. ROHC UDP -- non-RTP UDP/IP compression (Profile 0x0002)
UDP/IP headers do not have a sequence number which is as well-behaved
as the RTP Sequence Number. For UDP/IPv4, there is an IP-ID field
which may be echoed in feedback information, but when no IPv4 header
is present such feedback identification becomes problematic.
Therefore, in the ROHC UDP profile, the compressor generates a 16-bit
sequence number SN which increases by one for each packet received in
the packet stream. This sequence number is thus relatively well-
behaved and can serve as the basis for most mechanisms described for
ROHC RTP. It is called SN or UDP SN below. Unless stated otherwise,
the mechanisms of ROHC RTP are used also for ROHC UDP, with the UDP
SN taking the role of the RTP Sequence Number.
----------------------------------------------------------------[Page 129]
The ROHC UDP profile always uses p = -1 when interpreting the SN,
since there will be no repetitions or reordering of the compressor-
generated SN. The interpretation interval thus always starts with
(ref_SN + 1).
5.11.1. Initialization
The static context for ROHC UDP streams can be initialized in either
of two ways:
1) By using an IR packet as in section 5.7.7.1, where the profile is
two (2) and the static chain ends with the static part of an UDP
packet. At the compressor, UDP SN is initialized to a random
value when the IR packet is sent.
2) By reusing an existing context where the existing static chain
contains the static part of a UDP packet, e.g., the context of a
stream compressed using ROHC RTP (profile 0x0001). This is done
with an IR-DYN packet (section 5.7.7.2) identifying profile
0x0002, where the dynamic chain corresponds to the prefix of the
existing static chain that ends with the UDP header. UDP SN is
initialized to the RTP Sequence Number if the earlier profile was
profile 0x0001, and to a random number otherwise.
For ROHC UDP, the dynamic part of a UDP packet is different from
section 5.7.7.5: a two-octet field containing the UDP SN is added
after the Checksum field. This affects the format of dynamic chains
in IR and IR-DYN packets.
Note: 2) can be used for packet streams which were initially assumed
to be RTP streams, so that compression started with profile 0x0001,
but were later found evidently not to be RTP streams.
5.11.2. States and modes
ROHC UDP uses the same states and modes as ROHC RTP. Mode
transitions and state logic are the same except when explicitly
stated otherwise. Mechanisms dealing with fields in the RTP header
(except the RTP SN) are not used. The decompressed UDP SN is never
included in any header delivered to upper layers. The UDP SN is used
in place of the RTP SN in feedback.
----------------------------------------------------------------[Page 130]
5.11.3. Packet types
The general format of a ROHC UDP packet is the same as for ROHC RTP
(see beginning of section 5.7). Padding and CIDs are the same, as is
the feedback packet type (5.7.6.1) and the feedback. IR and IR-DYN
packets (5.7.7) are changed as described in 5.11.1.
The general format of compressed packets is also the same, but there
are differences in specific formats and extensions as detailed below.
The differences are caused by removal of all RTP specific information
except the RTP SN, which is replaced by the UDP SN.
Unless explicitly stated below, the packet formats are as in sections
5.7.1-6.
R-1
The TS field is replaced by an IP-ID field. The M flag has become
part of IP-ID. The X bit has moved. The formats R-1-ID and R-1-
TS are not used.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 0 | SN |
+===+===+===+===+===+===+===+===+
| X | IP-ID |
+---+---+---+---+---+---+---+---+
UO-1
The TS field is replaced by an IP-ID field. The M flag has become
part of SN. Formats UO-1-ID and UO-1-TS are not used.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 0 | IP-ID |
+===+===+===+===+===+===+===+===+
| SN | CRC |
+---+---+---+---+---+---+---+---+
UOR-2
----------------------------------------------------------------[Page 131]
New format:
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 1 0 | SN |
+===+===+===+===+===+===+===+===+
| X | CRC |
+---+---+---+---+---+---+---+---+
5.11.4. Extensions
Extensions are as in 5.7.5, with the following exceptions:
Extension 0:
+---+---+---+---+---+---+---+---+
| 0 0 | SN | IP-ID |
+---+---+---+---+---+---+---+---+
Extension 1:
+---+---+---+---+---+---+---+---+
| 0 1 | SN | IP-ID |
+---+---+---+---+---+---+---+---+
| IP-ID |
+---+---+---+---+---+---+---+---+
Extension 2:
+---+---+---+---+---+---+---+---+
| 1 0 | SN | IP-ID2 |
+---+---+---+---+---+---+---+---+
| IP-ID2 |
+---+---+---+---+---+---+---+---+
| IP-ID |
+---+---+---+---+---+---+---+---+
IP-ID2: For outer IP-ID field.
Extension 3 is the same as Extension 3 in section 5.7.5, with the
following exceptions.
1) The initial flag octet has the following format:
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
| 1 1 | S | Mode | I | ip | ip2 |
+-----+-----+-----+-----+-----+-----+-----+-----+
----------------------------------------------------------------[Page 132]
Mode: Replaces R-TS and Tsc of 5.7.5. Provides mode information
as was earlier done in RTP header flags and fields.
ip2: Replaces rtp bit of 5.7.5. Moved here from the Inner IP
header flags octet.
2) The bit which was the ip2 flag in the Inner IP header flags in
5.7.5 is reserved. It is set to zero when sending and ignored
when receiving.
5.11.5. IP-ID
Treated as in ROHC RTP, but the offset is from UDP SN.
5.11.6. Feedback
Feedback is as for ROHC RTP with the following exceptions:
1) UDP SN replaces RTP SN in feedback.
2) The CLOCK option (5.7.6.6) is not used.
3) The JITTER option (5.7.6.7) is not used.
5.12. ROHC ESP -- ESP/IP compression (Profile 0x0003)
When the ESP header is being used with an encryption algorithm other
than NULL, subheaders after the ESP header are encrypted and cannot
be compressed. Profile 0x0003 is for compression of the chain of
headers up to and including the ESP header in this case. When the
NULL encryption algorithm is being used, other profiles can be used
and could give higher compression rates. See section 5.8.4.3.
This profile is very similar to the ROHC UDP profile. It uses the
ESP sequence number as the basis for compression instead of a
generated number, but is otherwise very similar to ROHC UDP. The
interpretation interval (value of p) for the ESP-based SN is as with
ROHC RTP (profile 0x0001). Apart from this, unless stated explicitly
below, mechanisms and formats are as for ROHC UDP.
5.12.1. Initialization
The static context for ROHC ESP streams can be initialized in either
of two ways:
1) by using an IR packet as in section 5.7.7.1, where the profile is
three (3) and the static chain ends with the static part of an ESP
header.
----------------------------------------------------------------[Page 133]
2) by reusing an existing context, where the existing static chain
contains the static part of an ESP header. This is done with an
IR-DYN packet (section 5.7.7.2) identifying profile 0x0003, where
the dynamic chain corresponds to the prefix of the existing static
chain that ends with the ESP header.
In contrast to ROHC UDP, no extra sequence number is added to the
dynamic part of the ESP header: the ESP sequence number is the only
element.
Note: 2) can be used for streams where compression has been initiated
under the assumption that NULL encryption was being used with ESP.
When it becomes obvious that an encryption algorithm other than NULL
is being used, the compressor may send an IR-DYN according to 2) to
switch to profile 0x0003 without having to send an IR packet.
5.12.2. Packet types
The packet types for ROHC ESP are the same as for ROHC UDP, except
that the ESP sequence number is used instead of the generated
sequence number of ROHC UDP. The ESP header is not part of any
compressed list in ROHC ESP.
6. Implementation issues
This document specifies mechanisms for the protocol and leaves many
details on the use of these mechanisms to the implementers. This
chapter is aimed to give guidelines, ideas and suggestions for
implementing the scheme.
6.1. Reverse decompression
This section describes an OPTIONAL decompressor operation to reduce
the number of packets discarded due to an invalid context.
Once a context becomes invalid (e.g., when more consecutive packet
losses than expected have occurred), subsequent compressed packets
cannot immediately be decompressed correctly. Reverse decompression
aims at decompressing such packets later instead of discarding them,
by storing them until the context has been updated and validated and
then attempting decompression.
Let the sequence of stored packets be i, i + 1, ..., i + k, where i
is the first packet and i + k is the last packet before the context
was updated. The decompressor will attempt to recover the stored
packets in reverse order, i.e., starting with i + k, and working back
toward i. When a stored packet has been reconstructed, its
correctness is verified using its CRC. Packets not carrying a CRC
----------------------------------------------------------------[Page 134]
must not be delivered to upper layers. Packets where the CRC
succeeds are delivered to upper layers in their original order, i.e.,
i, i + 1, ..., i + k.
Note that this reverse decompression introduces buffering while
waiting for the context to be validated and thereby introduces
additional delay. Thus, it should be used only when some amount of
delay is acceptable. For example, for video packets belonging to the
same video frame, the delay in packet arrivals does not cause
presentation time delay. Delay-insensitive streaming applications
can also be tolerant of such delay. If the decompressor cannot
determine whether the application can tolerate delay, it should not
perform reverse decompression.
The following illustrates the decompression procedure in some detail:
1. The decompressor stores compressed packets that cannot be
decompressed correctly due to an invalid context.
2. When the decompressor has received a context updating packet and
the context has been validated, it proceeds to recover the last
packet stored. After decompression, the decompressor checks the
correctness of the reconstructed header using the CRC.
3. If the CRC indicates successful decompression, the decompressor
stores the complete packet and attempts to decompress the
preceding packet. In this way, the stored packets are recovered
in reverse order until no compressed packets are left. For each
packet, the decompressor checks the correctness of the
decompressed headers using the header compression CRC.
4. If the CRC indicates an incorrectly decompressed packet, the
reverse decompression attempt MUST be terminated and all remaining
uncompressed packets MUST be discarded.
5. Finally, the decompressor forwards all the correctly decompressed
packets to upper layers in their original order.
6.2. RTCP
RTCP is the RTP Control Protocol [RTP]. RTCP is based on periodic
transmission of control packets to all participants in a session,
using the same distribution mechanism as for data packets. Its
primary function is to provide feedback from the data receivers on
the quality of the data distribution. The feedback information may
be used for issues related to congestion control functions, and
directly useful for control of adaptive encodings.
----------------------------------------------------------------[Page 135]
In an RTP session there will be two types of packet streams: one with
the RTP header and application data, and one with the RTCP control
information. The difference between the streams at the transport
level is in the UDP port numbers: the RTP port number is always even,
the RTCP port number is that number plus one and therefore always odd
[RTP, section 10]. The ROHC header compressor implementation has
several ways at hand to handle the RTCP stream:
1. One compressor/decompressor entity carrying both types of streams
on the same channel, using CIDs to distinguish between them. For
sending a single RTP stream together with its RTCP packets on one
channel, it is most efficient to set LARGE_CIDS to false, send the
RTP packets with the implied CID 0 and use the Add-CID mechanism
to send the RTCP packets.
2. Two compressor/decompressor entities, one for RTP and another one
for RTCP, carrying the two types of streams on separate channels.
This means that they will not share the same CID number space.
RTCP headers may simply be sent uncompressed using profile 0x0000.
More efficiently, ROHC UDP compression (profile 0x0002) can be used.
6.3. Implementation parameters and signals
A ROHC implementation may have two kinds of parameters: configuration
parameters that are mandatory and must be negotiated between
compressor and decompressor peers, and implementation parameters that
are optional and, when used, stipulate how a ROHC implementation is
to operate.
Configuration parameters are mandatory and must be negotiated between
compressor and decompressor, so that they have the same values at
both compressor and decompressor, see section 5.1.1.
Implementation parameters make it possible for an external entity to
stipulate how an implementation of a ROHC compressor or decompressor
should operate. Implementation parameters have local significance,
are optional to use and are thus not necessary to negotiate between
compressor and decompressor. Note that this does not preclude
signaling or negotiating implementation parameters using lower layer
functionality in order to set the way a ROHC implementation should
operate. Some implementation parameters are valid only at either of
compressor or decompressor. Implementation parameters may further be
divided into parameters that allow an external entity to describe the
way the implementation should operate and parameters that allow an
external entity to trigger a specific event, i.e., signals.
----------------------------------------------------------------[Page 136]
6.3.1. ROHC implementation parameters at compressor
CONTEXT_REINITIALIZATION -- signal
This parameter triggers a reinitialization of the entire context at
the decompressor, both the static and the dynamic part. The
compressor MUST, when CONTEXT_REINITIALIZATION is triggered, back off
to the IR state and fully reinitialize the context by sending IR
packets with both the static and dynamic chains covering the entire
uncompressed headers until it is reasonably confident that the
decompressor contexts are reinitialized. The context
reinitialization MUST be done for all contexts at the compressor.
This parameter may for instance be used to do context relocation at,
e.g., a cellular handover that results in a change of compression
point in the radio access network.
NO_OF_PACKET_SIZES_ALLOWED -- value: positive integer
This parameter may be set by an external entity to specify the number
of packet sizes a ROHC implementation may use. However, the
parameter may be used only if PACKET_SIZES is not used by an external
entity. With this parameter set, the ROHC implementation at the
compressor MUST NOT use more different packet sizes than the value
this parameter stipulates. The ROHC implementation must itself be
able to determine which packet sizes will be used and describe these
to an external entity using PACKET_SIZES_USED. It should be noted
that one packet size might be used for several header formats, and
that the number of packet sizes can be reduced by employing padding
and segmentation.
NO_OF_PACKET_SIZES_USED _- value: positive integer
This parameter is set by the ROHC implementation to indicate how many
packet sizes it will actually use. It can be set to a large value to
indicate that no particular attempt is made to minimize that number.
PACKET_SIZES_ALLOWED -- value: list of positive integers (bytes)
This parameter, if set, governs which packet sizes in bytes may be
used by the ROHC implementation. Thus, packet sizes not in the set
of values for this parameter MUST NOT be used. Hence, an external
entity can mandate a ROHC implementation to produce packet sizes that
fit pre-configured lower layers better. If this parameter is used to
stipulate which packet sizes a ROHC implementation can use, the
following rules apply:
- A packet large enough to hold the entire IR header (both static and
dynamic chain) MUST be part of the set of sizes, unless MRRU is set
to a large enough value to allow segmentation.
- The packet size likely to be used most frequently in the SO state
SHOULD be part of the set.
----------------------------------------------------------------[Page 137]
- The packet size likely to be used most frequently in the FO state
SHOULD be part of the set.
PACKET_SIZES_USED -- values: set of positive integers (bytes)
This parameter describes which packet sizes a ROHC implementation
uses if NO_OF_PACKET_SIZES_ALLOWED or PACKET_SIZES_ALLOWED is used by
an external entity to stipulate how many packet sizes a ROHC
implementation should use. The information about used packet sizes
(bytes) in this parameter, may then be used to configure lower
layers.
PAYLOAD_SIZES -_ values: set of positive integer values (bytes)
This parameter is set by an external entity that wants to make use of
the PACKET_SIZES_USED parameter to indicate which payload sizes can
be expected.
When a ROHC implementation has a limited set of allowed packet sizes,
and the most preferable header format has a size that is not part of
the set, it has the following options:
- Choose the next larger header format from the allowed set. This is
probably the most efficient choice.
- Use the most preferable header format as if there were no
restrictions on size, and then add padding octets to complete a
packet of the next larger size in the allowed set.
- Use segmentation to fragment the packet into pieces that would make
up packets of sizes that are permissible (possibly after the
addition of padding to the last segment).
It should be noted that even if the two last parameters introduce the
possibility of restricting the number of packet sizes used, such
restrictions will have a negative impact on compression performance.
6.3.2. ROHC implementation parameters at decompressor
MODE -- values: [U-mode, O-mode, R-mode]
This parameter triggers a mode transition using the mechanism
described in chapter 5 when the parameter changes value, i.e., to U-
mode (Unidirectional mode), O-mode (Bidirectional Optimistic mode) or
R-mode (Bidirectional Reliable mode). The mode transition is made
from the current mode to the new mode as signaled by the
implementation parameter. For example, if the current mode is
Bidirectional Optimistic mode, MODE should have the value O-mode. If
the MODE is changed to R-mode, a mode transition MUST be made from
Bidirectional Optimistic mode to Bidirectional Reliable mode. MODE
should not only serve as a trigger for mode transitions, but also
make it visible which mode ROHC operates in.
----------------------------------------------------------------[Page 138]
CLOCK_RESOLUTION -- value: nonnegative integer
This parameter indicates the system clock resolution in units of
milliseconds. A zero (0) value means that there is no clock
available. If nonzero, this parameter allows the decompressor to use
timer-based TS compression (section 4.5.4) and SN wraparound
detection (section 5.3.2.2.4). In this case, its specific value is
also significant for correctness of the algorithms.
REVERSE_DECOMPRESSION_DEPTH -- value: nonnegative integer
This parameter determines whether reverse decompression as described
in section 6.1 should be used or not, and if used, to what extent.
The value indicates the maximum number of packets that can be
buffered, and thus possibly be reverse decompressed by the
decompressor. A zero (0) value means that reverse decompression MUST
NOT be used.
6.4. Handling of resource limitations at the decompressor
In a point-to-point link, the two nodes can agree on the number of
compressed sessions they are prepared to support for this link. It
may, however, not be possible for the decompressor to accurately
predict when it will run out of resources. ROHC allows the
negotiated number of contexts to be larger than could be accommodated
in the worst case. Then, as context resources are consumed, an
attempt to set up a new context may be rejected by the decompressor,
using the REJECT option of the feedback payload.
Upon reception of a REJECT option, the compressor SHOULD wait for a
while before attempting to compress additional streams destined for
the rejecting node.
6.5. Implementation structures
This section provides some explanatory material on data structures
that a ROHC implementation will have to maintain in one form or
another. It is not intended to constrain the implementations.
6.5.1. Compressor context
The compressor context consists of a static part and a dynamic part.
The content of the static part is the same as the static chain
defined in section 5.7.7. The dynamic part consists of multiple
elements which can be categorized into four types.
a) Sliding Window (SW)
b) Translation Table (TT)
c) Flag
d) Field
----------------------------------------------------------------[Page 139]
These elements may be common to all modes or mode specific. The
following table summarizes all these elements.
+--------+---------------------------+-------------+----------------+
| | Common to | Specific to | Specific to |
| | all modes | R-mode | U/O-mode |
+--------+---------------------------+-------------+----------------+
| SWs | GSW | R_CSW | UO_CSW |
| | | R_IESW | UO_IESW |
+--------+---------------------------+-------------+----------------+
| TTs | | R_CTT | UO_CTT |
| | | R_IETT | UO_IETT |
+--------+---------------------------+-------------+----------------+
| Flags | UDP Chksum | | ACKED |
| | TSS, TIS | | |
| | RND, RND2 | | |
| | NBO, NBO2 | | |
+--------+---------------------------+-------------+----------------+
| Fields | Profile | | CSRC_REF_ID |
| | C_MODE | | CSRC_GEN_ID |
| | C_STATE | | CSRC_GEN_COUNT |
| | C_TRANS | | IPEH_REF_ID |
| | TS_STRIDE (if TSS = 1) | | IPEH_GEN_ID |
| | TS_OFFSET (if TSS = 1) | | IPEH_GEN_COUNT |
| | TIME_STRIDE (if TIS = 1) | | |
| | CURR_TIME (if TIS = 1) | | |
| | MAX_JITTER_CD (if TIS = 1)| | |
| | LONGEST_LOSS_EVENT(O) | | |
| | CLOCK_RESOLUTION(O) | | |
| | MAX_JITTER(O) | | |
+--------+---------------------------+-------------+----------------+
1) GSW: Generic W_LSB Sliding Window
Each element in GSW consists of all the dynamic fields in the
dynamic chain (defined in section 5.7.7) plus the fields specified
in a) but excluding the fields specified in b).
a) Packet Arrival Time (if TIS = 1)
Scaled RTP Time Stamp (if TSS = 1) (optional)
Offset_i (if RND = 0) (optional)
b) UDP Checksum, TS Stride, CSRC list, IPv6 Extension Headers
2) R_CSW: CSRC Sliding Window in R-mode
R_IESW: IPv6 Extension Header Sliding Window in R-mode
----------------------------------------------------------------[Page 140]
UO_CSW: CSRC Sliding Window in U/O-mode
UO_IESW: IPv6 Extension Header Sliding Window in U/O-mode
Each element in R_CSW, R_IESW, UO_CSW and UO_IESW is defined in
section 6.5.3.
3) R_CTT: CSRC Translation Table in R-mode
R_IETT: IPv6 Extension Header Translation Table in U/O-mode
UO_CTT: CSRC Translation Table in U/O-mode
UO_IETT: IPv6 Extension Header Translation Table in U/O-mode
Each element in R_CTT and R_IETT is defined in section 5.8.1.1.
Each element in UO_CTT and UO_IETT is defined in section 5.8.1.2.
4) ACKED: Indicates whether or not the decompressor has ever acked
5) CURR_TIME: The current time value (used for context relocation
when timer-based timestamp compression is used)
6) All the other flags and fields are defined elsewhere in the ROHC
document.
6.5.2. Decompressor context
The decompressor context consists of a static part and a dynamic
part. The content of the static part is the same as the static chain
defined in section 5.7.7. The dynamic part consists of multiple
elements, one of which is the nonstatic reference header that
includes all the nonstatic fields. These nonstatic fields are the
fields in the dynamic chain defined in section 5.7.7, excluding UDP
Checksum and TS_Stride. All the remaining elements can be
categorized into four types:
a) Sliding Window (SW)
b) Translation Table (TT)
d) Flag
e) Field
These elements may be mode specific or common to all modes. The
following table summarizes all these elements.
----------------------------------------------------------------[Page 141]
+--------+---------------------------+-------------+----------------+
| | Common to | Specific to | Specific to |
| | all modes | R-mode | U/O-mode |
+--------+---------------------------+-------------+----------------+
| SWs | | R_CSW | UO_CSW |
| | | R_IESW | UO_IESW |
+--------+---------------------------+-------------+----------------+
| TTs | | R_CTT | UO_CTT |
| | | R_IETT | UO_IETT |
+--------+---------------------------+-------------+----------------+
| Flags | UDP Checksum | | ACKED |
| | TSS, TIS | | |
| | RND, RND2 | | |
| | NBO, NBO2 | | |
+--------+---------------------------+-------------+----------------+
| Fields | Profile | | CSRC_GEN_ID |
| | D_MODE | | IPEH_GEN_ID |
| | D_STATE | | PRE_SN_V_REF |
| | D_TRANS | | |
| | TS_STRIDE (if TSS = 1) | | |
| | TS_OFFSET (if TSS = 1) | | |
| | TIME_STRIDE (if TIS = 1) | | |
| | PKT_ARR_TIME (if TIS = 1) | | |
| | LONGEST_LOSS_EVENT(O) | | |
| | CLOCK_RESOLUTION(O) | | |
| | MAX_JITTER(O) | | |
+--------+---------------------------+-------------+----------------+
1) ACKED: Indicates whether or not ACK has ever been sent.
2) PKT_ARR_TIME: The arrival time of the packet that most recently
decompressed and verified using CRC.
PRE_SN_V_REF: The sequence number of the packet verified before
the most recently verified packet.
CSRC_GEN_ID: The CSRC gen_id of the most recently received packet.
IPEH_GEN_ID: The IPv6 Extension Header gen_id of the most recently
received packet.
3) The remaining elements are as defined in the compressor context.
6.5.3. List compression: Sliding windows in R-mode and U/O-mode
In R-mode list compression (see section 5.8.2.1), each entry in the
sliding window, both at the compressor side and at the decompressor
side, has the following structure:
----------------------------------------------------------------[Page 142]
+---------------------+--------+------------+
| RTP Sequence Number | icount | index list |
+---------------------+--------+------------+
The table index list contains a list of index. Each of these index
corresponds to the item in the original list carried in the packet
identified by the RTP Sequence Number. The mapping between the index
and the item is identified in the translation table. The icount
field carries the number of index in the following index list.
In U/O-mode list compression, each entry in the sliding window at
both the compressor side and decompressor side has the following
structure.
+--------+--------+------------+
| Gen_id | icount | index list |
+--------+--------+------------+
The icount and index list fields are the same as defined in R-mode.
Instead of using the RTP Sequence Number to identify each entry, the
Gen_id is included in the sliding window in U/O-mode.
7. Security Considerations
Because encryption eliminates the redundancy that header compression
schemes try to exploit, there is some inducement to forego encryption
of headers in order to enable operation over low-bandwidth links.
However, for those cases where encryption of data (and not headers)
is sufficient, RTP does specify an alternative encryption method in
which only the RTP payload is encrypted and the headers are left in
the clear. That would still allow header compression to be applied.
ROHC compression is transparent with regard to the RTP Sequence
Number and RTP Timestamp fields, so the values of those fields can be
used as the basis of payload encryption schemes (e.g., for
computation of an initialization vector).
A malfunctioning or malicious header compressor could cause the
header decompressor to reconstitute packets that do not match the
original packets but still have valid IP, UDP and RTP headers and
possibly also valid UDP checksums. Such corruption may be detected
with end-to-end authentication and integrity mechanisms which will
not be affected by the compression. Moreover, this header
compression scheme uses an internal checksum for verification of
reconstructed headers. This reduces the probability of producing
decompressed headers not matching the original ones without this
being noticed.
----------------------------------------------------------------[Page 143]
Denial-of-service attacks are possible if an intruder can introduce
(for example) bogus STATIC, DYNAMIC or FEEDBACK packets onto the link
and thereby cause compression efficiency to be reduced. However, an
intruder having the ability to inject arbitrary packets at the link
layer in this manner raises additional security issues that dwarf
those related to the use of header compression.
8. IANA Considerations
The ROHC profile identifier is a non-negative integer. In many
negotiation protocols, it will be represented as a 16-bit value. Due
to the way the profile identifier is abbreviated in ROHC packets, the
8 least significant bits of the profile identifier have a special
significance: Two profile identifiers with identical 8 LSBs should be
assigned only if the higher-numbered one is intended to supersede the
lower-numbered one. To highlight this relationship, profile
identifiers should be given in hexadecimal (as in 0x1234, which would
for example supersede 0x0A34).
Following the policies outlined in [IANA-CONSIDERATIONS], the IANA
policy for assigning new values for the profile identifier shall be
Specification Required: values and their meanings must be documented
in an RFC or in some other permanent and readily available reference,
in sufficient detail that interoperability between independent
implementations is possible. In the 8 LSBs, the range 0 to 127 is
reserved for IETF standard-track specifications; the range 128 to 254
is available for other specifications that meet this requirement
(such as Informational RFCs). The LSB value 255 is reserved for
future extensibility of the present specification.
The following profile identifiers are already allocated:
Profile Document Usage
identifier
0x0000 RFCthis ROHC uncompressed
0x0001 RFCthis ROHC RTP
0x0002 RFCthis ROHC UDP
0x0003 RFCthis ROHC ESP
----------------------------------------------------------------[Page 144]
9. Acknowledgments
Earlier header compression schemes described in [CJHC], [IPHC], and
[CRTP] have been important sources of ideas and knowledge.
The editor would like to extend his warmest thanks to Mikael
Degermark, who actually did a lot of the editing work, and Peter
Eriksson, who made a copy editing pass through the document,
significantly increasing its editorial consistency. Of course, all
remaining editorial problems have then been inserted by the editor.
Thanks to Andreas Jonsson (Lulea University), who supported this work
by his study of header field change patterns.
Finally, this work would not have succeeded without the continual
advice in navigating the IETF standards track, garnished with both
editorial and technical comments, from the IETF transport area
directors, Allison Mankin and Scott Bradner.
10. Intellectual Property Right Claim Considerations
The IETF has been notified of intellectual property rights claimed in
regard to some or all of the specification contained in this
document. For more information consult the online list of claimed
rights.
The IETF takes no position regarding the validity or scope of any
intellectual property 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; neither does it represent that it
has made any effort to identify any such rights. Information on the
IETF's procedures with respect to rights in standards-track and
standards-related documentation can be found in BCP-11. Copies of
claims of rights made available for publication 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 implementors or users of this specification can
be obtained from the IETF Secretariat.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights which may cover technology that may be required to practice
this standard. Please address the information to the IETF Executive
Director.
----------------------------------------------------------------[Page 145]
11. References
11.1. Normative References
[UDP] Postel, J., "User Datagram Protocol", STD 6,
RFC 768, August 1980.
[IPv4] Postel, J., "Internet Protocol", STD 5, RFC
791, September 1981.
[IPv6] Deering, S. and R. Hinden, "Internet Protocol,
Version 6 (IPv6) Specification", RFC 2460,
December 1998.
[RTP] Schulzrinne, H., Casner, S., Frederick, R. and
V. Jacobson, "RTP: A Transport Protocol for
Real-Time Applications", RFC 1889, January
1996.
[HDLC] Simpson, W., "PPP in HDLC-like framing", STD
51, RFC 1662, July 1994.
[ESP] Kent, S. and R. Atkinson, "IP Encapsulating
Security Payload", RFC 2406, November 1998.
[NULL] Glenn, R. and S. Kent, "The NULL Encryption
Algorithm and Its Use With Ipsec", RFC 2410,
November 1998.
[AH] Kent, S. and R. Atkinson, "IP Authentication
Header", RFC 2402, November 1998.
[MINE] Perkins, C., "Minimal Encapsulation within IP",
RFC 2004, October 1996.
[GRE1] Farinacci, D., Li, T., Hanks, S., Meyer, D. and
P. Traina, "Generic Routing Encapsulation
(GRE)", RFC 2784, March 2000.
[GRE2] Dommety, G., "Key and Sequence Number
Extensions to GRE", RFC 2890, August 2000.
[ASSIGNED] Reynolds, J. and J. Postel, "Assigned Numbers",
STD 2, RFC 1700, October 1994.
----------------------------------------------------------------[Page 146]
11.2. Informative References
[VJHC] Jacobson, V., "Compressing TCP/IP Headers for
Low-Speed Serial Links", RFC 1144, February
1990.
[IPHC] Degermark, M., Nordgren, B. and S. Pink, "IP
Header Compression", RFC 2507, February 1999.
[CRTP] Casner, S. and V. Jacobson, "Compressing
IP/UDP/RTP Headers for Low-Speed Serial Links",
RFC 2508, February 1999.
[CRTPC] Degermark, M., Hannu, H., Jonsson, L.E.,
Svanbro, K., "Evaluation of CRTP Performance
over Cellular Radio Networks", IEEE Personal
Communication Magazine, Volume 7, number 4, pp.
20-25, August 2000.
[REQ] Degermark, M., "Requirements for robust
IP/UDP/RTP header compression", RFC 3096, June
2001.
[LLG] Svanbro, K., "Lower Layer Guidelines for Robust
RTP/UDP/IP Header Compression", Work in
Progress.
[IANA-CONSIDERATIONS] Alvestrand, H. and T. Narten, "Guidelines for
Writing an IANA Considerations Section in
RFCs", BCP 26, RFC 2434, October 1998.
----------------------------------------------------------------[Page 147]
12. Authors' Addresses
Carsten Bormann, Editor
Universitaet Bremen TZI
Postfach 330440
D-28334 Bremen, Germany
Phone: +49 421 218 7024
Fax: +49 421 218 7000
EMail: cabo@tzi.org
Carsten Burmeister
Panasonic European Laboratories GmbH
Monzastr. 4c
63225 Langen, Germany
Phone: +49-6103-766-263
Fax: +49-6103-766-166
EMail: burmeister@panasonic.de
Mikael Degermark
The University of Arizona
Dept of Computer Science
P.O. Box 210077
Tucson, AZ 85721-0077, USA
Phone: +1 520 621-3498
Fax: +1 520 621-4642
EMail: micke@cs.arizona.edu
Hideaki Fukushima
Matsushita Electric Industrial Co.,
Ltd006, Kadoma, Kadoma City,
Osaka, Japan
Phone: +81-6-6900-9192
Fax: +81-6-6900-9193
EMail: fukusima@isl.mei.co.jp
----------------------------------------------------------------[Page 148]
Hans Hannu
Box 920
Ericsson Erisoft AB
SE-971 28 Lulea, Sweden
Phone: +46 920 20 21 84
Fax: +46 920 20 20 99
EMail: hans.hannu@ericsson.com
Lars-Erik Jonsson
Box 920
Ericsson Erisoft AB
SE-971 28 Lulea, Sweden
Phone: +46 920 20 21 07
Fax: +46 920 20 20 99
EMail: lars-erik.jonsson@ericsson.com
Rolf Hakenberg
Panasonic European Laboratories GmbH
Monzastr. 4c
63225 Langen, Germany
Phone: +49-6103-766-162
Fax: +49-6103-766-166
EMail: hakenberg@panasonic.de
Tmima Koren
Cisco Systems, Inc.
170 West Tasman Drive
San Jose, CA 95134, USA
Phone: +1 408-527-6169
EMail: tmima@cisco.com
----------------------------------------------------------------[Page 149]
Khiem Le
2-700
Mobile Networks Laboratory
Nokia Research Center
6000 Connection Drive
Irving, TX 75039, USA
Phone: +1-972-894-4882
Fax: +1 972 894-4589
EMail: khiem.le@nokia.com
Zhigang Liu
2-700
Mobile Networks Laboratory
Nokia Research Center
6000 Connection Drive
Irving, TX 75039, USA
Phone: +1 972 894-5935
Fax: +1 972 894-4589
EMail: zhigang.liu@nokia.com
Anton Martensson
Ericsson Radio Systems AB
Torshamnsgatan 23
SE-164 80 Stockholm, Sweden
Phone: +46 8 404 3881
Fax: +46 8 757 5550
EMail: anton.martensson@era.ericsson.se
Akihiro Miyazaki
Matsushita Electric Industrial Co., Ltd
1006, Kadoma, Kadoma City, Osaka, Japan
Phone: +81-6-6900-9192
Fax: +81-6-6900-9193
EMail: akihiro@isl.mei.co.jp
----------------------------------------------------------------[Page 150]
Krister Svanbro
Box 920
Ericsson Erisoft AB
SE-971 28 Lulea, Sweden
Phone: +46 920 20 20 77
Fax: +46 920 20 20 99
EMail: krister.svanbro@ericsson.com
Thomas Wiebke
Panasonic European Laboratories GmbH
Monzastr. 4c
63225 Langen, Germany
Phone: +49-6103-766-161
Fax: +49-6103-766-166
EMail: wiebke@panasonic.de
Takeshi Yoshimura
NTT DoCoMo, Inc.
3-5, Hikarinooka
Yokosuka, Kanagawa, 239-8536, Japan
Phone: +81-468-40-3515
Fax: +81-468-40-3788
EMail: yoshi@spg.yrp.nttdocomo.co.jp
Haihong Zheng
2-700
Mobile Networks Laboratory
Nokia Research Center
6000 Connection Drive
Irving, TX 75039, USA
Phone: +1 972 894-4232
Fax: +1 972 894-4589
EMail: haihong.zheng@nokia.com
----------------------------------------------------------------[Page 151]
Next To :: RObust Header Compression - Part 7
Credits
-- UnKnown --
|