rfc2508.txt

来自「RFC 的详细文档!」· 文本 代码 · 共 1,348 行 · 第 1/5 页

TXT
1,348
字号






Network Working Group                                          S. Casner
Request for Comments: 2508                                 Cisco Systems
Category: Standards Track                                    V. Jacobson
                                                           Cisco Systems
                                                           February 1999


       Compressing IP/UDP/RTP Headers for Low-Speed Serial Links

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

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

Abstract

   This document describes a method for compressing the headers of
   IP/UDP/RTP datagrams to reduce overhead on low-speed serial links.
   In many cases, all three headers can be compressed to 2-4 bytes.

   Comments are solicited and should be addressed to the working group
   mailing list rem-conf@es.net and/or the author(s).

   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.

1.  Introduction

   Since the Real-time Transport Protocol was published as an RFC [1],
   there has been growing interest in using RTP as one step to achieve
   interoperability among different implementations of network
   audio/video applications.  However, there is also concern that the
   12-byte RTP header is too large an overhead for 20-byte payloads when
   operating over low speed lines such as dial-up modems at 14.4 or 28.8
   kb/s.  (Some existing applications operating in this environment use
   an application-specific protocol with a header of a few bytes that
   has reduced functionality relative to RTP.)






Casner & Jacobson           Standards Track                     [Page 1]

RFC 2508             Compressing IP/UDP/RTP Headers        February 1999


   Header size may be reduced through compression techniques as has been
   done with great success for TCP [2].  In this case, compression might
   be applied to the RTP header alone, on an end-to-end basis, or to the
   combination of IP, UDP and RTP headers on a link-by-link basis.
   Compressing the 40 bytes of combined headers together provides
   substantially more gain than compressing 12 bytes of RTP header alone
   because the resulting size is approximately the same (2-4 bytes) in
   either case.  Compressing on a link-by-link basis also provides
   better performance because the delay and loss rate are lower.
   Therefore, the method defined here is for combined compression of IP,
   UDP and RTP headers on a link-by-link basis.

   This document defines a compression scheme that may be used with
   IPv4, IPv6 or packets encapsulated with more than one IP header,
   though the initial focus is on IPv4.  The IP/UDP/RTP compression
   defined here is intended to fit within the more general compression
   framework specified in [3] for use with both IPv6 and IPv4.  That
   framework defines TCP and non-TCP as two classes of transport above
   IP.  This specification creates IP/UDP/RTP as a third class extracted
   from the non-TCP class.

2.  Assumptions and Tradeoffs

   The goal of this compression scheme is to reduce the IP/UDP/RTP
   headers to two bytes for most packets in the case where no UDP
   checksums are being sent, or four bytes with checksums.  It is
   motivated primarily by the specific problem of sending audio and
   video over 14.4 and 28.8 dialup modems.  These links tend to provide
   full-duplex communication, so the protocol takes advantage of that
   fact, though the protocol may also be used with reduced performance
   on simplex links.  This compression scheme performs best on local
   links with low round-trip-time.

   This specification does not address segmentation and preemption of
   large packets to reduce the delay across the slow link experienced by
   small real-time packets, except to identify in Section 4 some
   interactions between segmentation and compression that may occur.
   Segmentation schemes may be defined separately and used in
   conjunction with the compression defined here.

   It should be noted that implementation simplicity is an important
   factor to consider in evaluating a compression scheme.
   Communications servers may need to support compression over perhaps
   as many as 100 dial-up modem lines using a single processor.
   Therefore, it may be appropriate to make some simplifications in the
   design at the expense of generality, or to produce a flexible design
   that is general but can be subsetted for simplicity.  Higher
   compression gain might be achieved by communicating more complex



Casner & Jacobson           Standards Track                     [Page 2]

RFC 2508             Compressing IP/UDP/RTP Headers        February 1999


   models for the changing header fields from the compressor to the
   decompressor, but that complexity is deemed unnecessary.  The next
   sections discuss some of the tradeoffs listed here.

2.1.  Simplex vs. Full Duplex

   In the absence of other constraints, a compression scheme that worked
   over simplex links would be preferred over one that did not.
   However, operation over a simplex link requires periodic refreshes
   with an uncompressed packet header to restore compression state in
   case of error.  If an explicit error signal can be returned instead,
   the delay to recovery may be shortened substantially.  The overhead
   in the no-error case is also reduced.  To gain these performance
   improvements, this specification includes an explicit error
   indication sent on the reverse path.

   On a simplex link, it would be possible to use a periodic refresh
   instead.  Whenever the decompressor detected an error in a particular
   packet stream, it would simply discard all packets in that stream
   until an uncompressed header was received for that stream, and then
   resume decompression.  The penalty would be the potentially large
   number of packets discarded.  The periodic refresh method described
   in Section 3.3 of [3] applies to IP/UDP/RTP compression on simplex
   links or links with high delay as well as to other non-TCP packet
   streams.

2.2.  Segmentation and Layering

   Delay induced by the time required to send a large packet over the
   slow link is not a problem for one-way audio, for example, because
   the receiver can adapt to the variance in delay.  However, for
   interactive conversations, minimizing the end-to-end delay is
   critical.  Segmentation of large, non-real-time packets to allow
   small real-time packets to be transmitted between segments can reduce
   the delay.

   This specification deals only with compression and assumes
   segmentation, if included, will be handled as a separate layer.  It
   would be inappropriate to integrate segmentation and compression in
   such a way that the compression could not be used by itself in
   situations where segmentation was deemed unnecessary or impractical.
   Similarly, one would like to avoid any requirements for a reservation
   protocol.  The compression scheme can be applied locally on the two
   ends of a link independent of any other mechanisms except for the
   requirements that the link layer provide some packet type codes, a
   packet length indication, and good error detection.





Casner & Jacobson           Standards Track                     [Page 3]

RFC 2508             Compressing IP/UDP/RTP Headers        February 1999


   Conversely, separately compressing the IP/UDP and RTP layers loses
   too much of the compression gain that is possible by treating them
   together.  Crossing these protocol layer boundaries is appropriate
   because the same function is being applied across all layers.

3.  The Compression Algorithm

   The compression algorithm defined in this document draws heavily upon
   the design of TCP/IP header compression as described in RFC 1144 [2].
   Readers are referred to that RFC for more information on the
   underlying motivations and general principles of header compression.

3.1.  The basic idea

   In TCP header compression, the first factor-of-two reduction in data
   rate comes from the observation that half of the bytes in the IP and
   TCP headers remain constant over the life of the connection.  After
   sending the uncompressed header once, these fields may be elided from
   the compressed headers that follow.  The remaining compression comes
   from differential coding on the changing fields to reduce their size,
   and from eliminating the changing fields entirely for common cases by
   calculating the changes from the length of the packet.  This length
   is indicated by the link-level protocol.

   For RTP header compression, some of the same techniques may be
   applied.  However, the big gain comes from the observation that
   although several fields change in every packet, the difference from
   packet to packet is often constant and therefore the second-order
   difference is zero.  By maintaining both the uncompressed header and
   the first-order differences in the session state shared between the
   compressor and decompressor, all that must be communicated is an
   indication that the second-order difference was zero.  In that case,
   the decompressor can reconstruct the original header without any loss
   of information simply by adding the first-order differences to the
   saved uncompressed header as each compressed packet is received.

   Just as TCP/IP header compression maintains shared state for multiple
   simultaneous TCP connections, this IP/UDP/RTP compression SHOULD
   maintain state for multiple session contexts.  A session context is
   defined by the combination of the IP source and destination
   addresses, the UDP source and destination ports, and the RTP SSRC
   field.  A compressor implementation might use a hash function on
   these fields to index a table of stored session contexts.  The
   compressed packet carries a small integer, called the session context
   identifier or CID, to indicate in which session context that packet
   should be interpreted.  The decompressor can use the CID to index its
   table of stored session contexts directly.




Casner & Jacobson           Standards Track                     [Page 4]

RFC 2508             Compressing IP/UDP/RTP Headers        February 1999


   Because the RTP compression is lossless, it may be applied to any UDP
   traffic that benefits from it.  Most likely, the only packets that
   will benefit are RTP packets, but it is acceptable to use heuristics
   to determine whether or not the packet is an RTP packet because no
   harm is done if the heuristic gives the wrong answer.  This does
   require executing the compression algorithm for all UDP packets, or
   at least those with even port numbers (see section 3.4).

   Most compressor implementations will need to maintain a "negative
   cache" of packet streams that have failed to compress as RTP packets
   for some number of attempts in order to avoid further attempts.
   Failing to compress means that some fields in the potential RTP
   header that are expected to remain constant most of the time, such as
   the payload type field, keep changing.  Even if the other such fields
   remain constant, a packet stream with a constantly changing SSRC
   field SHOULD be entered in the negative cache to avoid consuming all
   of the available session contexts.  The negative cache is indexed by
   the source and destination IP address and UDP port pairs but not the
   RTP SSRC field since the latter may be changing.  When RTP
   compression fails, the IP and UDP headers MAY still be compressed.

   Fragmented IP Packets that are not initial fragments and packets that
   are not long enough to contain a complete UDP header MUST NOT be sent
   as FULL_HEADER packets.  Furthermore, packets that do not
   additionally contain at least 12 bytes of UDP data MUST NOT be used
   to establish RTP context.  If such a packet is sent as a FULL_HEADER
   packet, it MAY be followed by COMPRESSED_UDP packets but MUST NOT be
   followed by COMPRESSED_RTP packets.

3.2.  Header Compression for RTP Data Packets

   In the IPv4 header, only the total length, packet ID, and header
   check-sum fields will normally change.  The total length is redundant
   with the length provided by the link layer, and since this
   compression scheme must depend upon the link layer to provide good
   error detection (e.g., PPP's CRC [4]), the header checksum may also
   be elided.  This leaves only the packet ID, which, assuming no IP
   fragmentation, would not need to be communicated.  However, in order
   to maintain lossless compression, changes in the packet ID will be
   transmitted.  The packet ID usually increments by one or a small

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?