RFC 3242

RObust Header Compression (ROHC): A Link-Layer Assisted Profile for IP/UDP/RTP

πŸ“… published April 2002, from ietf

Okay bestie, this is RFC 3242 πŸŽ€, written by L-E. Jonsson and G. Pelletier from Ericsson, and it's dated April 2002. It's on the Standards Track πŸ‘‘, which means it's an actual Internet standards-track protocol spec, not just a vibe. The title block doesn't list anything it obsoletes or updates, so this one stands on its own 🌸.


Status of This Memo πŸ“œ

This document specifies an Internet standards track protocol for the Internet community, and it's asking for discussion and suggestions for improvements 🫢. For the standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited πŸ’–.

Copyright (C) The Internet Society (2002). All Rights Reserved.

Abstract 🌈

Okay so this doc defines a ROHC (Robust Header Compression) profile for squishing IP/UDP/RTP (Internet Protocol/User Datagram Protocol/Real-Time Transport Protocol) packets. The main move is that it gets help from the lower layers, which lets it boost compression efficiency by completely erasing the header on most packets when everything is running optimally πŸ’…. The profile is built as an extension of the ROHC RTP profile. It adds extra mechanisms that ROHC needs, states requirements on the assisting layer so everything stays transparent ✨, and lays out general compression and decompression logic that uses this header-free packet.

Table of Contents 🧚

   1.  Introduction....................................................2
   2.  Terminology.....................................................4
   3.  Overview of the Link-Layer Assisted Profile.....................5
        3.1.  Providing Packet Type Identification.....................6
        3.2.  Replacing the Sequence Number............................6
        3.3.  CRC Replacement..........................................7
        3.4.  Applicability of This Profile............................7
   4.  Additions and Exceptions Compared to ROHC RTP...................8
        4.1.  Additional Packet Types..................................8
               4.1.1.  No-Header Packet (NHP)..........................8
               4.1.2.  Context Synchronization Packet (CSP)............8
               4.1.3.  Context Check Packet (CCP)......................9

        4.2.  Interfaces Towards the Assisting Layer..................11
               4.2.1.  Interface, Compressor to Assisting Layer.......11
               4.2.2.  Interface, Assisting Layer to Decompressor.....12
        4.3.  Optimistic Approach Agreement...........................13
        4.4.  Fast Context Initialization, IR Redefinition............13
        4.5.  Feedback Option, CV-REQUEST.............................14
        4.6.  Periodic Context Verification...........................15
        4.7.  Use of Context Identifier...............................15
   5.  Implementation Issues..........................................15
        5.1.  Implementation Parameters and Signals...................15
               5.1.1.  Implementation Parameters at the Compressor....16
               5.1.2.  Implementation Parameters at the Decompressor..17
        5.2.  Implementation over Various Link Technologies...........18
   6.  IANA Considerations............................................18
   7.  Security Considerations........................................18
   8.  Acknowledgements...............................................18
   9.  References.....................................................19
   10. Authors' Addresses.............................................20
   11. Full Copyright Statement.......................................21

1. Introduction ✨

So, header compression is basically squishing a packet's header info down, then transparently un-squishing it again, on a per-hop basis πŸ¦‹. It works by hunting down redundancy inside each packet and between consecutive packets in a packet stream. Over the years, folks built protocols [VJHC, IPHC] to compress network and transport headers [IPv4, IPv6, UDP, TCP], and these schemes totally slayed on wired bottleneck links like modem connections over telephone networks πŸ“ž. On top of IP, UDP, and TCP compression, there's also Compressed RTP [CRTP], which was made to squeeze real-time traffic running on the Real-Time Transport Protocol [RTP] even harder πŸ’œ.

The schemes above were all designed around normal assumptions about link characteristics, and those assumptions were traditionally based on wired links only. But now there are more and more wireless links in Internet paths, so those assumptions aren't generally valid anymore 😭. In wireless environments, especially wide coverage cellular environments, relatively high error rates are tolerated so the radio resources can be used efficiently. Real-time traffic cares more about delays than errors, and these operating conditions will be the norm over, for example, 3rd generation cellular links, so header compression has to tolerate packet loss. The problem is that the earlier schemes, especially for real-time traffic compressed by CRTP, have been shown to significantly degrade header compression performance at high error rates [CRTPC]. This problem was the driving force behind creating the RObust Header Compression (ROHC) WG in the IETF πŸ”₯.

The ROHC WG built a header compression framework that profiles can be defined on top of, for different protocol sets or different compression strategies 🌸. Because CRTP has limited packet loss robustness, and the cellular industry wanted an efficient way to carry voice over IP over wireless, ROHC has so far mostly focused on compressing IP/UDP/RTP headers. Those headers are pretty generous in size, especially compared to the payloads that often ride inside packets with such headers πŸ“.

ROHC RTP has become a very efficient, robust and capable compression scheme. It can compress headers down to a total size of one octet only 🀩. Transparency is also guaranteed to an extremely great extent, even when residual bit errors are present in compressed headers delivered to the decompressor. The requirements for RTP compression [RTP-REQ], which the WG set before and during development, have been fulfilled, so it's a W πŸ‘‘.

As mentioned above, the 3rd generation cellular systems, where IP will be used end-to-end, were one of the big driving forces behind ROHC RTP. The scheme was also designed to suit new cellular air interfaces, like WCDMA, so it's possible to run even speech services with spectrum efficiency insignificantly lower than existing one-service circuit switched solutions [VTC2000]. However, other air interfaces, such as those based on GSM and IS-95, will also be used in all-IP networks, which brings more header compression implications πŸ™ˆ. These older air interfaces are less flexible, with radio bearers optimized for specific payload sizes. That means not even a single octet of header can be added without jumping up to the next higher fixed packet size the link supports, which is obviously very costly πŸ’€. For the speech vocoders already deployed, the spectrum efficiency over these links will therefore be low compared to existing circuit switched solutions. To get high spectrum efficiency overall with any application, more flexible air interfaces must be deployed. Then ROHC RTP will perform excellently, as shown for WCDMA [MOMUC01]. For deployment reasons, though, it's still important to provide a suitable header compression strategy for already existing vocoders and air interfaces, such as GERAN and CDMA2000, with minimal effects on spectral efficiency 🫢.

This document defines a new link-layer assisted ROHC RTP profile that extends ROHC RTP (profile 0x0001) [ROHC] and is compliant with the ROHC 0-byte requirements [0B-REQ] πŸ¦‹. The purpose of this new profile is to provide a header-free packet format. For a certain application behavior, it can replace a majority of the 1-octet header ROHC RTP packets during normal U/O-mode operation, while still being fully transparent and complying with all the requirements of ROHC RTP [RTP-REQ]. For other applications, compression is carried out just like normal ROHC RTP πŸ’–.

To completely eliminate the compressed header, all the functionality normally provided by the 1-octet header has to come from other means. That typically means using functionality from the lower layers and sacrificing efficiency for the less frequently occurring larger compressed headers. This isn't a contradiction, since the argument for eliminating the last octet for most packets isn't overall efficiency in general 🧠. It's important to remember that this profile is about efficiently matching existing applications to existing link technologies, not efficiency in general. The additional complexity this profile brings, even though it's minimized by a tight integration with existing ROHC functionality, means it should therefore only be used to optimize performance of specific applications over specific links 🚨.

When implementing this profile over various link technologies, care must be taken to guarantee that all the functionality needed is provided by ROHC and the lower layers together. Therefore, additional documents should specify how to incorporate this profile on top of various link technologies πŸ“š.

2. Terminology πŸ“–

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 RFC 2119. Yes, these are the official requirement words, so they're doing serious work here πŸ”₯.

Here are the abbreviations, bestie:

   CCP    Context Check Packet
   CRC    Cyclic Redundancy Check
   CSP    Context Synchronization Packet
   LLA    Link Layer Assisted ROHC RTP profile
   NHP    No Header Packet
   ROHC   RObust Header Compression
   RHP    ROHC Header Packet (a non-NHP packet, i.e., RRP, CSP or CCP)
   RRP    ROHC RTP Packet as defined in [ROHC, profile 0x0001]

Assisting layer 🧩

"Assisting layer" refers to any entity implementing the interface to ROHC (section 4.2). It may, for example, refer to a sub-layer used to adapt the ROHC implementation and the physical link layer. This layer is assumed to have knowledge of the physical layer synchronization.

Compressing side πŸŽ€

"Compressing side" refers to the combination of the header compressor, operating with the LLA profile, and its associated assisting layer.

Lower layers 🌈

"Lower layers" in this document refers to entities located below ROHC in the protocol stack, including the assisting layer.

ROHC RTP πŸ’…

"ROHC RTP" in this document refers to the IP/UDP/RTP profile (profile 0x0001) as defined in [ROHC].

okay so this is profile 0x0005 (hex) πŸŽ€, the ROHC IP/UDP/RTP profile defined in this doc. It's built for channels that have been tuned for specific payload sizes, so they can't handle header info well when it rides along with payloads of those optimal sizes πŸ₯Ί

The LLA profile extends the ROCH RTP profile and inherits all of its functionality πŸ’…. On top of that, it adds some extra stuff and an interface from the ROHC component to an assisting lower layer 🫢

              +---------------------------------------+
              |                                       |
 The LLA      |    ROHC RTP,                          |
 profile      |    Profile #1       +-----------------+
              |                     |  LLA Additions  |
              +---------------------+-----------------+

By putting extra demands on the lower layers compared to [ROHC], it's possible to work out the info needed to keep header compression robust and transparent, even though the headers are completely gone for most of the operation time πŸ¦‹

Basically, this profile swaps the smallest and most frequent ROHC U/O-mode headers for a no-header format, and the header functionality has to be handled by other means 🧚

 Smallest header in                 Smallest header in
 ROHC RTP (profile #1)              LLA (profile #5)
+--+--+--+--+--+--+--+--+              ++
|        1 octet        |  ----->      ||  No Header
+--+--+--+--+--+--+--+--+              ++
            |
            |                        Header field functionality
            +------------------->    provided by other means

The fields in the ROHC RTP headers for U/O-mode PT0 are the packet type identifier, the sequence number and the CRC πŸ“¦. The next sections break down how the functionality of each of these gets replaced for NHP πŸ’–

3.1. Providing Packet Type Identification

every ROHC header carries a packet type identifier that tells the decompressor how to read it πŸ‘€. In 0-byte header compression you still need a way to handle that job. ROHC RTP packets with compressed headers can be told apart thanks to the identifier, but there needs to be a mechanism that separates packets with a header from packets without one. This function MUST therefore be provided by the assisting layer in one way or another πŸ”₯

3.2. Replacing the Sequence Number

From the sending application, the RTP sequence number goes up by one for each packet sent πŸ“ˆ. The sequence number is there to deal with packet reordering and packet loss πŸ™ƒ. If reordering or loss has already happened before the transmission point, the compressing side can easily dodge problems by not allowing a header-free packet, if needed πŸ™…β€β™€οΈ

However, at the transmission point, loss or reordering that might happen over the link can't be predicted or covered 😀. So for NHP, the assisting layer MUST guarantee in-order delivery over the link (already assumed by [ROHC]), and at the receiving side it MUST provide an indication for each packet loss over the link 🫠. This is basically the same principle that the VJ header compression [VJHC] relies on 🧠

Note that guaranteeing in-order delivery and packet loss indication over the link doesn't just make it possible to infer the sequence number information. It also supersedes the main job of the CRC, which normally handles errors from long link losses and bit errors in the compressed sequence number πŸ’…

3.3. CRC Replacement

All context updating RRP packets carry a CRC calculated over the uncompressed header πŸ”. The decompressor uses the CRC to verify that the updated context is correct. In U/O-mode, this verification serves three purposes:

  1. Detection of longer losses than can be covered by the sequence number LSBs
  2. Protection against failures caused by residual bit errors in compressed headers
  3. Protection against faulty implementations and other causes of error

Since this profile defines an NHP packet without this CRC, you have to take care of these purposes by other means when an NHP is used as a replacement for a context updating packet 🧐. Detection of long losses (1) is already covered, since the assisting layer MUST provide indication of all packet losses. Furthermore, the NHP packet has one big advantage over RHP packets: residual bit errors (2) cannot damage a header that isn't even sent πŸ™Œ

So it's reasonable to assume that compression and decompression transparency can be assured with high confidence, even without a CRC in header-free packets ✨. However, to add protection against damage propagation from undetected residual bit errors in context updating packets (2) or other unexpected errors (3), periodic context verifications SHOULD be performed (see section 4.6) πŸ›‘οΈ

3.4. Applicability of This Profile

The LLA profile can be used with any link technology that can provide the functionality described in the previous sections πŸ”Œ. Whether LLA or ROHC RTP should be implemented depends on the characteristics of the link itself πŸ€”. For most RTP packet streams, LLA works exactly like ROHC RTP, while it's more efficient for packet streams with certain characteristics ✨. LLA will never be less efficient than ROHC RTP πŸ’―

Note as well that LLA, like all other ROHC profiles, is fully transparent to any packet stream reaching the compressor 🫧. LLA doesn't make any assumptions about the packet stream, but it performs optimally for packet streams with certain characteristics, e.g., synchronized streams exactly timed with the assisting link that the LLA profile is implemented over πŸ•°οΈ

The LLA profile is obviously not applicable if the UDP checksum (2 bytes) is enabled, which is always the case for IPv6/UDP πŸ™…. For IPv4/UDP, the sender may choose to disable the UDP checksum 🫢

4. Additions and Exceptions Compared to ROHC RTP 🌈

4.1. Additional Packet Types

The LLA profile defines three new packet types, to be used in addition to the RRP packet types defined by [ROHC] 🧁. The following sections describe these packet types and their purpose in detail πŸ“

4.1.1. No-Header Packet (NHP)

A No-Header Packet (NHP), i.e., a packet consisting only of a payload, is defined and MAY be used when only sequencing has to be conveyed, meaning when all header fields are either unchanged or follow the currently established change pattern πŸ’œ. There are also some considerations for the use of the NHP (see 4.3, 4.5 and 4.6) πŸ“Œ. An LLA compressor is not allowed to deliver NHP packets when operating in R-mode 🚫

The assisting layer MAY send the NHP for RTP SN = X only if an NHP was delivered by the LLA compressor AND the assisting layer can guarantee that the decompressor will infer the proper sequencing for this NHP. This guarantee is based on the confidence that the decompressor:

  • a) has the means to infer proper sequencing for the packet corresponding to SN = X-1, AND
  • b) has either received a loss indication or the packet itself for the packet corresponding to SN = X-1.

Updating properties: NHP packets update context (RTP Sequence Number) 🌸

4.1.2. Context Synchronization Packet (CSP)

The case where the packet stream overruns the channel bandwidth may lead to data being discarded, which may result in decompressor context invalidation 😱. So it might be beneficial to send a packet with only the header information and discard the payload 🎁. This helps keep the decompressor context synchronized while still using the available bandwidth efficiently πŸ’ͺ

This case can be handled with the Context Synchronization Packet (CSP), which has the following format:

     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 1   1   1   1   1   0   1   0 | Packet type identifier
   +===+===+===+===+===+===+===+===+
   :  ROHC header without padding  :
   :    see [ROHC, section 5.7]    :
   +---+---+---+---+---+---+---+---+

Updating properties: CSP maintains the updating properties of the ROHC header it carries πŸ¦‹

The CSP is defined by one of the unused packet type identifiers from ROHC RTP, carried in the one-octet base header 🧩. As for any ROHC packet, except the NHP, the packet may begin with ROHC padding and/or feedback. It may also carry context identification after the packet type identifier πŸ†”. It's possible to have two CID fields present, one after the packet type ID and one within the encapsulated ROHC header πŸ‘―. If a decompressor receives a CSP with two non-equal CID values included, the packet MUST be discarded πŸ—‘οΈ. ROHC segmentation may also be applied to the CSP βœ‚οΈ

Note that when the decompressor has received and processed a CSP, the packet (including any possible data following the CSP encapsulated compressed header) MUST be discarded πŸ’€

4.1.3. Context Check Packet (CCP) 🧚

okay bestie, so the Context Check Packet (CCP) is defined and it's giving minimal πŸ’… It carries no payload at all. The only extra thing is an optional CRC value sitting next to the packet type identifier πŸŽ€

The whole point of the CCP is to be a useful little packet that a synchronized physical link layer MAY send when data has to go out at fixed intervals, even if no compressed packet is ready to go πŸ¦‹ Whether the CCP actually gets sent over the link and delivered to the decompressor is decided by the assisting layer ✨ Here's the format:

     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 1   1   1   1   1   0   1   1 | Packet type identifier
   +===+===+===+===+===+===+===+===+
   | C |          CRC              |
   +---+---+---+---+---+---+---+---+

C: C = 0 indicates that the CRC field is not used. C = 1 indicates that a valid CRC is present.

Updating properties: CCP packets do not update context. 🌸

The CCP is defined by one of the unused packet type identifiers from ROHC RTP, carried in the first octet of the base header. The first bit of the second octet, the C bit, says whether the CRC field is used or not. If C=1, the CRC field MUST be set to the 7-bits CRC calculated over the original uncompressed header defined in [ROHC section 5.9.2]. As for any ROHC packet, except NHP, the packet MAY begin with ROHC padding and/or carry context identification πŸ’–

Using the CRC field to do decompressor context verification is optional, so it's a compressor implementation issue πŸ™ˆ However, a CCP MUST always be made available to the assisting layer, no exceptions bestie 🫢

If the assisting layer receives CCPs with the C-bit set (C=1) from the compressor, it MUST use the last CCP received if a CCP is to be sent. That means the CCP corresponding to the last non-CCP packet sent (NHP, RRP or CSP) πŸ”₯ An assisting layer MAY use the CCP for other purposes, such as signaling a packet loss before the link ✨

The decompressor is REQUIRED to handle a CCP received with the C bit set (C=1), which indicates a valid CRC field, and to perform context verification. The received CRC MUST then be applied to the last decompressed packet, unless a packet loss indication was previously received. Upon CRC failure, actions MUST be taken as specified in [ROHC, section 5.3.2.2.3]. A CCP received with C=0 MUST be ignored by the decompressor, and the decompressor is not allowed to make any further interpretation of the CCP πŸ’…

The use of CCP by an assisting layer is optional and depends on the characteristics of the actual link. Whether it is used or not MUST therefore be specified in link layer implementation specifications for this profile πŸ“


4.2. Interfaces Towards the Assisting Layer πŸŽ€

This profile relies on the lower layers to provide the functionality needed to let NHP packets be sent. This interaction between LLA and the assisting layer is defined as the interfaces between the LLA compressor/decompressor and the LLA applicable link technology πŸ¦‹

                |                              |
                +                              +
   +-------------------------+    +-------------------------+
   |       ROHC RTP HC       |    |       ROHC RTP HD       |
   +-------------------------+    +-------------------------+
   |       LLA profile       |    |       LLA profile       |
   +=========================+    +=========================+
   |       Interface         |    |        Interface        |
   | ROHC to assisting layer |    | Assisting layer to ROHC |
   +=========================+    +=========================+
   |       Applicable        |    |       Applicable        |
   |     link technology     |    |     link technology     |
   +=========================+    +=========================+
                |                              |
                +------>---- CHANNEL ---->-----+

The figure above shows the various levels, as defined in [ROHC] and this document, that make up a complete implementation of the LLA profile. It also underlines the need for additional documents that specify how to implement these interfaces for a link technology this profile is relevant to 🧚

This section defines the information the LLA compressor and the assisting layer need to swap for this profile to operate properly. It defines the semantics, but it does not specify how these interfaces are to be implemented ✨

4.2.1. Interface, Compressor to Assisting Layer πŸ’Œ

This section defines the interface semantics between the compressor and the assisting layer, including the rules for packet delivery from the compressor 🫢

The interface defines these parameters: RRP, RRP segmentation flag, CSP, CSP segmentation flag, NHP, and RTP Sequence Number. Every parameter except the NHP MUST always be delivered to the assisting layer. That leads to two possible delivery scenarios:

a. RRP, CSP, CCP, NHP and RTP Sequence Number are delivered, along with the corresponding segmentation flags set accordingly. 🌈

This is the case when the compressor allows sending of an NHP packet, with or without segmentation being applied to the corresponding RRP/CSP packets.

Recall that delivery of an NHP packet happens when the ROHC RTP compressor would have used a ROHC UO-0 πŸ‘‘

b. RRP, CSP, CCP and RTP Sequence Number are delivered, along with the corresponding segmentation flags set accordingly. πŸ’œ

This is the case when the compressor does not allow sending of an NHP packet. Segmentation might be applied to the corresponding RRP and CSP packets.

Segmentation may be applied independently to an RRP or a CSP packet if its size exceeds the largest value provided in the PREFERRED PACKET_SIZES list and the LARGE_PACKET_ALLOWED parameter is set to false. The segmentation flags are spelled out in the interface definition to make it clear that the RRP and the CSP may be delivered by the compressor as segmented packets πŸ¦‹

The RTP SN MUST be delivered for each packet by the compressor, so the assisting layer can keep the necessary sequencing information straight πŸ”₯

4.2.2. Interface, Assisting Layer to Decompressor 🧠

Here we define the interface semantics between the assisting layer and the decompressor, with simple rules for delivering received packets to the decompressor. The decompressor needs a way to tell NHP packets apart from RHP packets. Also, when it receives packets without a header, it needs a way to infer the sequencing information so the received payload stays in sync with the sequence information of the decompressed headers. To make this work, the decompressor MUST receive the following from the assisting layer:

  • an indication for each packet loss over the link between the compressing and decompressing sides for CID=0
  • the received packet, together with an indication of whether the received packet is an NHP or not

Note that the context is updated from a packet loss indication πŸ’€


4.3. Optimistic Approach Agreement 🌸

ROHC defines an optimistic approach for updates to reduce header overhead. This approach is fully exploited in the Optimistic and Unidirectional modes of operation. Because every compressed header has a CRC, the optimistic approach is only a compressor issue, since the decompressor will always be able to detect an invalid context through CRC verification πŸ”

But there's no CRC in the NHP packet defined by the LLA profile, so the loss of an RHP packet that updates the context may not always get detected. To avoid this problem, the compressing and decompressing sides must agree on the principles for the optimistic approach, and the agreed principles MUST be enforced not only by the compressor but also by the transmitting assisting layer. For example, if three consecutive updates are sent to convey a header field change, the decompressor must know this and invalidate the context in case of three or more consecutive physical packet losses. Note that the mechanism used to enforce the optimistic approach must be reinitialized if a new field change needs to be conveyed while the compressing side is still sending packets to convey non-linear context updates πŸ’…

An LLA decompressor MUST use the optimistic approach knowledge to detect possible context loss events. If context loss is suspected, it MUST invalidate the context and MUST NOT forward any packets before the context has been synchronized 🚨

It is REQUIRED that all documents describing how the LLA profile is implemented over a certain link technology define how the optimistic approach is agreed between the compressing side and the decompressing side. It could be handled with a fixed principle, negotiation at startup, or by other means, but the method must be unambiguously defined πŸŽ€


4.4. Fast Context Initialization, IR Redefinition πŸš€

As initial IR packets might overrun the channel bandwidth and significantly delay decompressor context establishment, it might be beneficial to initially discard the payload. This lets state transitions and higher compression efficiency happen with minimal delay ✨

To do this, the D-bit from the basic structure of the ROHC RTP IR packet [ROHC section 5.7.7.1] is redefined for the LLA profile. For D=0 (no dynamic chain), the meaning of the D-bit is extended to indicate that the payload has been discarded when the IR packet was assembled. All other fields keep the meanings they have in ROHC RTP 🧚

The resulting structure, using small CIDs and CID=0, looks like this:

     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 1 | 1 | 1 | 1 | 1 | 1 | 0 | D |
   +---+---+---+---+---+---+---+---+
   |            Profile            | 1 octet
   +---+---+---+---+---+---+---+---+
   |              CRC              | 1 octet
   +---+---+---+---+---+---+---+---+
   |            Static             | variable length
   |             chain             |
    - - - - - - - - - - - - - - - -
   |            Dynamic            | not present if D = 0
   |             chain             | present if D = 1, variable length
    - - - - - - - - - - - - - - - -
   |            Payload            | not present if D = 0
   |                               | present if D = 1, variable length
    - - - - - - - - - - - - - - - -

D: D = 0 indicates that the dynamic chain is not present and the payload has been discarded.

After an IR packet with D=0 has been processed by the decompressor, the packet MUST be discarded πŸ—‘οΈ


4.5. Feedback Option, CV-REQUEST πŸ’¬

The CV-REQUEST option MAY be used by the decompressor to request an RRP or CSP for context verification. This option should be used if only NHP packets have been received for a long time, so the context hasn't been verified recently πŸ₯Ί

   +---+---+---+---+---+---+---+---+
   |  Opt Type = 8 |  Opt Len = 0  |
   +---+---+---+---+---+---+---+---+

If the compressor receives a feedback packet with this option, the next packet compressed SHOULD NOT be delivered to the assisting layer as an NHP 🌈

4.6. Periodic Context Verification ✨

okay so, section 3.3 says transparency is supposed to be handled by the lower layers 🫢. That means this profile should be at least as reliable as the older header compression schemes [VJHC, IPHC, CRTP], which don't use a header compression CRC. But ROHC RTP is already super safe on the transparency front, so it would be really nice to get that same level of safety with LLA too πŸ’….

To add an extra layer of transparency protection and catch surprise errors, like ones caused by buggy implementations, it is RECOMMENDED to periodically send context updating packets, even when the compressor logic allows NHP packets to be used. πŸ›‘οΈ

4.7. Use of Context Identifier πŸ†”

Okay, this one's a little restriction. An NHP cannot carry a context identifier (CID), so there are limits on how this profile can be used for context identification πŸ™ˆ. No matter which CID size was negotiated, NHP packets can only be used for CID=0. If the decompressor gets an NHP packet, it can only belong to CID=0.

Also, if a compressor using LLA is handling multiple packet streams, the assisting layer must be able to tell which CID a physical packet loss hit. At the very least, it MUST be able to tell if packets with CID=0 (the packet stream with NHPs) have been lost. Don't skip this one, bestie 😭.

5. Implementation Issues πŸ› οΈ

This document specifies the mechanisms for the protocol and leaves the details of using them up to the implementers πŸ’œ. This chapter is basically a bunch of guidelines, ideas and suggestions for implementing LLA 🧚.

5.1. Implementation Parameters and Signals πŸŽ›οΈ

As described in [ROHC, section 6.3], implementations use parameters to set up configuration info and to decide how a ROHC implementation should operate. The parameters below are new additions that are useful for LLA, on top of the parameter set defined for ROHC RTP implementations. Heads up: if the PREFERRED_PACKET_SIZES parameters defined here are used, they obsolete all PACKET_SIZE and PAYLOAD_SIZE parameters of ROHC RTP ⚠️.

5.1.1. Implementation Parameters at the Compressor πŸ—œοΈ

ALWAYS_PAD -- value: boolean

This parameter may be set by an external entity to tell the compressor that every RHP packet MUST be padded with a minimum of one octet of ROHC padding 🌸.

The assisting layer MUST provide a packet type identification. If the link layer protocol doesn't have a field for this, a leading sequence can be used to tell RHP packets apart from NHP packets. Using a leading sequence isn't super efficient, since it costs RHP packets some efficiency. But the loss should be pretty small, because the leading sequence only goes on packets that have headers, which keeps the header-free packets (the NHPs) as the favoured option πŸ¦‹. If you want a leading sequence for RHP identification, the lower layer MAY use ROHC padding for it by setting the ALWAYS_PAD parameter. Just be aware that in those cases, possible collisions between the padding and the NHP payload must be avoided πŸ‘€.

By default, this parameter is set to FALSE.

PREFERRED_PACKET_SIZES -- list of:

SIZE -- value: integer (octets)
RESTRICTED_TYPE -- values: [NHP_ONLY, RHP_ONLY, NO_RESTRICTION]

This parameter set controls which packet sizes the assisting layer prefers πŸ’–. If it's used, all RHP packets MUST be padded to fit the smallest possible preferred size. If the unpadded packet (or, if ALWAYS_PAD is set, the packet with its minimum one octet of padding) is bigger than the largest preferred packet size, the compressor has two options. It can either deliver the bigger packet at an arbitrary size, or it can split the packet into several segments using ROHC segmentation and pad each segment to one of the preferred sizes 🧩. Which one it does depends on the LARGE_PACKETS_ALLOWED parameter below.

NHP packets can only be delivered to the lower layer if their payload size is part of the preferred packet size set. Also, if RESTRICTED_TYPE is set to NHP_ONLY or RHP_ONLY for any preferred packet size, that size is only allowed for packets of the specified type πŸŽ€.

By default, no preferred packet sizes are specified. When sizes are specified, the default value for RESTRICTED_TYPE is NO_RESTRICTION.

LARGE_PACKETS_ALLOWED -- value: boolean

This parameter may be set by an external entity to say how to handle packets that don't fit any of the preferred packet sizes πŸ“¦. If it's set to TRUE, the compressor MUST deliver the larger packet as-is and MUST NOT use segmentation. If it's set to FALSE, the ROHC segmentation scheme MUST be used to split the packet into two or more segments, and each segment MUST further be padded to fit one of the preferred packet sizes πŸͺ„.

By default, this parameter is set to TRUE, which means segmentation is disabled.

VERIFICATION_PERIOD -- value: integer

This parameter may be set by an external entity to tell the compressor the minimum frequency at which a packet validating the context must be sent ⏰. In other words, a packet containing a CRC field MUST be sent at least once every N packets, where N=VERIFICATION_PERIOD (see section 4.6).

By default, this parameter is set to 0, which means periodical verifications are disabled πŸ™…β€β™€οΈ.

5.1.2. Implementation Parameters at the Decompressor πŸ”

NHP_PACKET -- value: boolean

This parameter tells the decompressor that the packet being delivered is an NHP packet 🧾. The decompressor MUST accept this packet type indicator from the lower layer. An assisting layer MUST set this indicator to true for every NHP packet delivered, and to false for any other packet βœ….

PHYSICAL_PACKET_LOSS -- signal

This signal tells the decompressor that a packet got lost on the link between the compressing and decompressing sides because of a physical link error πŸ’₯. The signal is given once for each lost packet, and the decompressor must increase the sequence number accordingly whenever this signal shows up πŸ”’.

PRE_LINK_PACKET_LOSS -- signal

This signal tells the decompressor to increase the sequence number because of a gap in the sequencing that isn't related to a physical link error πŸ•³οΈ. For example, a receiving assisting layer can use this signal to tell the decompressor that a packet was lost before reaching the compressor, or that the transmitting assisting layer discarded a packet.

This document provides the semantics and requirements of the interface that the ROHC compressor and decompressor need towards the assisting layer, so they can do link-layer assisted header compression πŸ¦‹.

That said, this document doesn't include any link-layer-specific operational info, apart from a few implementation suggestions. If you want the details on how this profile should be implemented over various link technologies, you'll need to check other documents. Those can take each link layer's specific characteristics into account to get the best possible use out of this profile πŸ’….

These specifications MAY use a packet type bit pattern that this profile doesn't use, in order to implement signaling on the lower layer. The pattern available to lower layer implementations is [11111001] 🌈.

6. IANA Considerations 🏷️

The IANA has reserved ROHC profile identifier 0x0005 for the IP/UDP/RTP profile defined in this document πŸŽ€.

7. Security Considerations 🚨

Okay, this part is serious, so I need you to pay attention 😭. The security considerations of ROHC RTP [ROHC section 7] also apply to this document, with one addition. In a denial-of-service attack where an intruder injects bogus CCP packets onto the link using random CRC values, the CRC check will fail for the wrong reasons on the decompressor side. That would seriously cut into the benefits of ROHC, and into any extra efficiency this profile provides, because of unnecessary context invalidation, feedback messages and refresh packets πŸ’€. Still, the same remarks about the presence of such an intruder still apply.

8. Acknowledgements 🫢

Huge thanks to Lila Madour, Ulises Olvera-Hernandez and Francis Lupien, who gave input on the typical links where LLA can be applied 🌸. Thanks also to Mikael Degermark for the super helpful discussions that led to improvements in this profile, and to Zhigang Liu for many valuable comments πŸ’œ.

9. References πŸ“š

Here's the full reference list, every entry included πŸ“:

[ROHC]      Bormann, C., Burmeister, C., Degermark, M., Fukushima,
            H., Hannu, H., Jonsson, L., Hakenberg, R., Koren, T., Le,
            K., Liu, Z., Martensson, A., Miyazaki, A., Svanbro, K.,
            Wiebke, T., Yoshimura, T. and H. Zheng, "RObust Header
            Compression (ROHC): Framework and four profiles: RTP,
            UDP, ESP, and uncompressed", RFC 3095, July 2001.

[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.

[UDP]       Postel, J., "User Datagram Protocol", STD 6, RFC 768,
            August 1980.

[RTP]       Schulzrinne, H., Casner S., Frederick, R. and V.
            Jacobson, "RTP: A Transport Protocol for Real-Time
            Applications", RFC 1889, January 1996.

[TCP]       Postel, P., "Transmission Control Protocol", STD 7, RFC
            793, September 1981.

[RTP-REQ]   Degermark, M., "Requirements for IP/UDP/RTP Header
            Compression", RFC 3096, July 2001.

[0B-REQ]    Jonsson, L-E., "RObust Header Compression (ROHC):
            Requirements and Assumptions for 0-byte IP/UDP/RTP
            Compression", RFC 3243, April 2002.

[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. and K. Svanbro,
            "Evaluation of CRTP Performance over Cellular Radio
            Networks", IEEE Personal Communications Magazine, Volume
            7, number 4, pp. 20-25, August 2000.

[VTC2000]   Svanbro, K., Hannu, H., Jonsson, L-E. and M. Degermark,
            "Wireless real time IP-services enabled by header
            compression", proceedings of IEEE VTC2000, May 2000.

[MOMUC01]   Liu, G., et al., "Experimental field trials results of
            Voice-over IP over WCDMA links", MoMuC'01 - The
            International Workshop on Mobile Multimedia
            Communications, Conference proceedings, February 2001.

10. Authors' Addresses πŸ’Œ

Here's where you can find the authors πŸ¦‹:

Lars-Erik Jonsson
Ericsson AB
Box 920
SE-971 28 Lulea
Sweden

Phone: +46 920 20 21 07
Fax:   +46 920 20 20 99
EMail: lars-erik.jonsson@ericsson.com

Ghyslain Pelletier
Ericsson AB
Box 920
SE-971 28 Lulea
Sweden

Phone: +46 920 20 24 32
Fax:   +46 920 20 20 99
EMail: ghyslain.pelletier@epl.ericsson.se

Okay bestie, legal stuff time πŸ’… Copyright is held by The Internet Society (2002), and all rights are reserved. πŸ”’

This document, and translations of it, can be copied and shared with others. People can also write derivative works that comment on it, explain it, or help people implement it, and they can prepare, copy, publish, and distribute those works in whole or in part with no real restrictions πŸ¦‹ The catch is that the copyright notice and this paragraph have to stay on every copy and every derivative work. ⭐

The document itself, though, can't be modified in any way. That means no removing the copyright notice or the references to the Internet Society or other Internet organizations πŸ™ˆ The exceptions are when it's needed for developing Internet standards, where the copyright procedures in the Internet Standards process have to be followed, or when it's being translated into a language other than English 🌈

The permissions above are perpetual πŸ’– They won't be revoked by the Internet Society or by anyone who takes over from it. 🫢

Now the disclaimer, which is serious and in caps for a reason πŸ’€ Quoted exactly:

This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS 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.

Acknowledgement πŸŽ€

Funding for the RFC Editor function is currently provided by the Internet Society. 🌸 So the people keeping the RFC series running are backed by the Internet Society right now, and we love a supportive crew πŸ‘‘

πŸ“¦ where this page comes from