summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc2507.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc2507.txt')
-rw-r--r--doc/rfc/rfc2507.txt2635
1 files changed, 2635 insertions, 0 deletions
diff --git a/doc/rfc/rfc2507.txt b/doc/rfc/rfc2507.txt
new file mode 100644
index 0000000..72a93bf
--- /dev/null
+++ b/doc/rfc/rfc2507.txt
@@ -0,0 +1,2635 @@
+
+
+
+
+
+
+Network Working Group M. Degermark
+Request for Comments: 2507 Lulea University of Technology/SICS
+Category: Standards Track B. Nordgren
+ Lulea University of Technology/Telia Research AB
+ S. Pink
+ Lulea University of Technology/SICS
+ February 1999
+
+
+ IP Header Compression
+
+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 how to compress multiple IP headers and TCP
+ and UDP headers per hop over point to point links. The methods can be
+ applied to of IPv6 base and extension headers, IPv4 headers, TCP and
+ UDP headers, and encapsulated IPv6 and IPv4 headers.
+
+ Headers of typical UDP or TCP packets can be compressed down to 4-7
+ octets including the 2 octet UDP or TCP checksum. This largely
+ removes the negative impact of large IP headers and allows efficient
+ use of bandwidth on low and medium speed links.
+
+ The compression algorithms are specifically designed to work well
+ over links with nontrivial packet-loss rates. Several wireless and
+ modem technologies result in such links.
+
+TABLE OF CONTENTS
+
+ 1. Introduction..............................................3
+ 2. Terminology...............................................5
+ 3. Compression method........................................7
+ 3.1. Packet types.......................................8
+ 3.2. Lost packets in TCP packet streams.................9
+ 3.3. Lost packets in UDP and non-TCP packet streams....10
+ 4. Grouping packets into packet streams.....................14
+
+
+
+Degermark, et. al. Standards Track [Page 1]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ 4.1. Guidelines for grouping packets...................15
+ 5. Size Issues..............................................16
+ 5.1. Context identifiers...............................16
+ 5.2. Size of the context...............................17
+ 5.3. Size of full headers..............................18
+ 5.3.1. Length fields in full TCP headers............19
+ 5.3.2. Length fields in full non-TCP headers........19
+ 6. Compressed Header Formats................................20
+ 7. Compression of subheaders................................22
+ 7.1. IPv6 Header.......................................24
+ 7.2. IPv6 Extension Headers............................25
+ 7.3. Options...........................................25
+ 7.4. Hop-by-hop Options Header.........................26
+ 7.5. Routing Header....................................26
+ 7.6. Fragment Header...................................27
+ 7.7. Destination Options Header........................28
+ 7.8. No Next Header....................................29
+ 7.9. Authentication Header.............................29
+ 7.10. Encapsulating Security Payload Header.............29
+ 7.11. UDP Header........................................30
+ 7.12. TCP Header........................................30
+ 7.13. IPv4 Header.......................................33
+ 7.14 Minimal Encapsulation header......................34
+ 8. Changing context identifiers.............................35
+ 9. Rules for dropping or temporarily storing packets........35
+ 10. Low-loss header compression for TCP .....................36
+ 10.1. The "twice" algorithm............................37
+ 10.2. Header Requests..................................37
+ 11. Links that reorder packets...............................38
+ 11.1. Reordering in non-TCP packet streams.............39
+ 11.2. Reordering in TCP packet streams.................39
+ 12. Hooks for additional header compression..................40
+ 13. Demultiplexing...........................................41
+ 14. Configuration Parameters.................................42
+ 15. Implementation Status....................................43
+ 16. Acknowledgments..........................................44
+ 17. Security Considerations..................................44
+ 18. Authors' Addresses.......................................45
+ 19. References...............................................46
+ 20. Full Copyright Statement.................................47
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 2]
+
+RFC 2507 IP Header Compression February 1999
+
+
+1. Introduction
+
+ There are several reasons to do header compression on low- or
+ medium-speed links. Header compression can
+
+ * Improve interactive response time
+
+ For very low-speed links, echoing of characters may take longer
+ than 100-200 ms because of the time required to transmit large
+ headers. 100-200 ms is the maximum time people can tolerate
+ without feeling that the system is sluggish.
+
+ * Allow using small packets for bulk data with good line efficiency
+
+ This is important when interactive (for example Telnet) and bulk
+ traffic (for example FTP) is mixed because the bulk data should be
+ carried in small packets to decrease the waiting time when a
+ packet with interactive data is caught behind a bulk data packet.
+
+ Using small packet sizes for the FTP traffic in this case is a
+ global solution to a local problem. It will increase the load on
+ the network as it has to deal with many small packets. A better
+ solution might be to locally fragment the large packets over the
+ slow link.
+
+ * Allow using small packets for delay sensitive low data-rate traffic
+
+ For such applications, for example voice, the time to fill a
+ packet with data is significant if packets are large. To get low
+ end-to-end delay small packets are preferred. Without header
+ compression, the smallest possible IPv6/UDP headers (48 octets)
+ consume 19.2 kbit/s with a packet rate of 50 packets/s. 50
+ packets/s is equivalent to having 20 ms worth of voice samples in
+ each packet. IPv4/UDP headers consumes 11.2 kbit/s at 50
+ packets/s. Tunneling or routing headers, for example to support
+ mobility, will increase the bandwidth consumed by headers by 10-20
+ kbit/s. This should be compared with the bandwidth required for
+ the actual sound samples, for example 13 kbit/s with GSM encoding.
+ Header compression can reduce the bandwidth needed for headers
+ significantly, in the example to about 1.7 kbit/s. This enables
+ higher quality voice transmission over 14.4 and 28.8 kbit/s
+ modems.
+
+ * Decrease header overhead.
+
+ A common size of TCP segments for bulk transfers over medium-speed
+ links is 512 octets today. When TCP segments are tunneled, for
+ example because Mobile IP is used, the IPv6/IPv6/TCP header is 100
+
+
+
+Degermark, et. al. Standards Track [Page 3]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ octets. Header compression will decrease the header overhead for
+ IPv6/TCP from 19.5 per cent to less than 1 per cent, and for
+ tunneled IPv4/TCP from 11.7 to less than 1 per cent. This is a
+ significant gain for line-speeds as high as a few Mbit/s.
+
+ The IPv6 specification prescribes path MTU discovery, so with IPv6
+ bulk TCP transfers should use segments larger than 512 octets when
+ possible. Still, with 1400 octet segments (RFC 894 Ethernet
+ encapsulation allows 1500 octet payloads, of which 100 octets are
+ used for IP headers), header compression reduces IPv6 header
+ overhead from 7.1% to 0.4%.
+
+ * Reduce packet loss rate over lossy links.
+
+ Because fewer bits are sent per packet, the packet loss rate will
+ be lower for a given bit-error rate. This results in higher
+ throughput for TCP as the sending window can open up more between
+ losses, and in fewer lost packets for UDP.
+
+ The mechanisms described here are intended for a point-to-point link.
+ However, care has been taken to allow extensions for multi-access
+ links and multicast.
+
+ Headers that can be compressed include TCP, UDP, IPv4, and IPv6 base
+ and extension headers. For TCP packets, the mechanisms of Van
+ Jacobson [RFC-1144] are used to recover from loss. Two additional
+ mechanisms that increase the efficiency of VJ header compression over
+ lossy links are also described. For non-TCP packets, compression
+ slow-start and periodic header refreshes allow minimal periods of
+ packet discard after loss of a header that changes the context. There
+ are hooks for adding header compression schemes on top of UDP, for
+ example compression of RTP headers.
+
+ Header compression relies on many fields being constant or changing
+ seldomly in consecutive packets belonging to the same packet stream.
+ Fields that do not change between packets need not be transmitted at
+ all. Fields that change often with small and/or predictable values,
+ e.g., TCP sequence numbers, can be encoded incrementally so that the
+ number of bits needed for these fields decrease significantly. Only
+ fields that change often and randomly, e.g., checksums or
+ authentication data, need to be transmitted in every header.
+
+ The general principle of header compression is to occasionally send a
+ packet with a full header; subsequent compressed headers refer to the
+ context established by the full header and may contain incremental
+ changes to the context.
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 4]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ This header compression scheme does not require that all packets in
+ the same stream passes over the compressed link. However, for TCP
+ streams the difference between subsequent headers can become more
+ irregular and the compression rate can decrease. Neither is it
+ required that corresponding TCP data and acknowledgment packets
+ traverse the link in opposite directions.
+
+ This header compression scheme is useful on first-hop or last-hop
+ links as well as links in the middle of the network. When many packet
+ streams (several hundred) traverse the link, a phenomenon that could
+ be called CID thrashing could occur, where headers seldom can be
+ matched with an existing context and have to be sent uncompressed or
+ as full headers. It is up to an implementation to use techniques such
+ as hysteresis to ensure that the packet streams that give the highest
+ compression rates keep their context. Such techniques are more
+ likely to be needed in the middle of the network.
+
+2. Terminology
+
+ This section explains some terms used in this document.
+
+ 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.
+
+ Subheader
+
+ An IPv6 base header, an IPv6 extension header, an IPv4 header, a
+ UDP header, or a TCP header.
+
+ Header
+
+ A chain of subheaders.
+
+ Compress
+
+ The act of reducing the size of a header by removing header fields
+ or reducing the size of header fields. This is done in a way such
+ that a decompressor can reconstruct the header if its context
+ state is identical to the context state used when compressing the
+ header.
+
+ Decompress
+
+ The act of reconstructing a compressed header.
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 5]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ Context identifier (CID)
+
+ A small unique number identifying the context that should be used
+ to decompress a compressed header. Carried in full headers and
+ compressed headers.
+
+ Context
+
+ The state which the compressor uses to compress a header and the
+ decompressor uses to decompress a header. The context is the
+ uncompressed version of the last header sent (compressor) or
+ received (decompressor) over the link, except for fields in the
+ header that are included "as-is" in compressed headers or can be
+ inferred from, e.g., the size of the link-level frame.
+
+ The context for a packet stream is associated with a context
+ identifier. The context for non-TCP packet streams is also
+ associated with a generation.
+
+ Generation
+
+ For non-TCP packet streams, each new version of the context for a
+ given CID is associated with a generation: a small number that is
+ incremented whenever the context associated with that CID changes.
+ Carried by full and compressed non-TCP headers.
+
+ Packet stream
+
+ A sequence of packets whose headers are similar and share context.
+ For example, headers in a TCP packet stream have the same source
+ and final destination address, and the same port numbers in the
+ TCP header. Similarly, headers in a UDP packet stream have the
+ same source and destination address, and the same port numbers in
+ the UDP header.
+
+ Full header (header refresh)
+
+ An uncompressed header that updates or refreshes the context for a
+ packet stream. It carries a CID that will be used to identify the
+ context.
+
+ Full headers for non-TCP packet streams also carry the generation
+ of the context they update or refresh.
+
+ Regular header
+
+ A normal, uncompressed, header. Does not carry CID or generation
+ association.
+
+
+
+Degermark, et. al. Standards Track [Page 6]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ Incorrect decompression
+
+ When a compressed and then decompressed header is different from
+ the uncompressed header. Usually due to mismatching context
+ between the compressor and decompressor or bit errors during
+ transmission of the compressed header.
+
+ Differential coding
+
+ A compression technique where the compressed value of a header
+ field is the difference between the current value of the field and
+ the value of the same field in the previous header belonging to
+ the same packet stream. A decompressor can thus obtain the value
+ of the field by adding the value in the compressed header to its
+ context. This technique is used for TCP streams but not for non-
+ TCP streams.
+
+3. Compression method
+
+ Much of the header information stays the same over the life-time of a
+ packet stream. For non-TCP packet streams almost all fields of the
+ headers are constant. For TCP many fields are constant and others
+ change with small and predictable values.
+
+ To initiate compression of the headers of a packet stream, a full
+ header carrying a context identifier, CID, is transmitted over the
+ link. The compressor and decompressor store most fields of this full
+ header as context. The context consists of the fields of the header
+ whose values are constant and thus need not be sent over the link at
+ all, or change little between consecutive headers so that it uses
+ fewer bits to send the difference from the previous value compared to
+ sending the absolute value.
+
+ Any change in fields that are expected to be constant in a packet
+ stream will cause the compressor to send a full header again to
+ update the context at the decompressor. As long as the context is the
+ same at compressor and decompressor, headers can be decompressed to
+ be exactly as they were before compression. However, if a full header
+ or compressed header is lost during transmission, the context of the
+ decompressor may become obsolete as it is not updated properly.
+ Compressed headers will then be decompressed incorrectly.
+
+ IPv6 is not meant to be used over links that can deliver a
+ significant fraction of damaged packets to the IPv6 module. This
+ means that links must have a very low bit-error rate or that link-
+ level frames must be protected by strong checksums, forward error
+ correction or something of that nature. Header compression SHOULD
+ not be used for IPv4 without strong link-level checksums. Damaged
+
+
+
+Degermark, et. al. Standards Track [Page 7]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ frames will thus be discarded by the link layer. The link layer
+ implementation might indicate to the header compression module that a
+ frame was damaged, but it cannot say what packet stream it belonged
+ to as it might be the CID that is damaged. Moreover, frames may
+ disappear without the link layer implementation's knowledge, for
+ example if the link is a multi-hop link where frames can be dropped
+ due to congestion at each hop. The kind of link errors that a header
+ compression module should deal with and protect against will thus be
+ packet loss.
+
+ So a header compression scheme needs mechanisms to update the context
+ at the decompressor and to detect or avoid incorrect decompression.
+ These mechanisms are very different for TCP and non-TCP streams, and
+ are described in sections 3.2 and 3.3.
+
+ The compression mechanisms in this document assume that packets are
+ not reordered between the compressor and decompressor. If the link
+
+ does reorder, section 11 describes mechanisms for ordering the
+ packets before decompression. It is also assumed that the link-layer
+ implementation can provide the length of packets, and that there is
+ no padding in UDP packets or tunneled packets.
+
+3.1. Packet types
+
+ This compression method uses four packet types in addition to the
+ IPv4 and IPv6 packet types. The combination of link-level packet
+ type and the value of the first four bits of the packet uniquely
+ determines the packet type. Details on how these packet types are
+ represented are in section 13.
+
+ FULL_HEADER - indicates a packet with an uncompressed header,
+ including a CID and, if not a TCP packet, a generation. It
+ establishes or refreshes the context for the packet stream
+ identified by the CID.
+
+ COMPRESSED_NON_TCP - indicates a non-TCP packet with a compressed
+ header. The compressed header consists of a CID identifying what
+ context to use for decompression, a generation to detect an
+ inconsistent context and the randomly changing fields of the
+ header.
+
+ COMPRESSED_TCP - indicates a packet with a compressed TCP header,
+ containing a CID, a flag octet indentifying what fields have
+ changed, and the changed fields encoded as the difference from
+ the previous value.
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 8]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ COMPRESSED_TCP_NODELTA - indicates a packet with a compressed TCP
+ header where all fields that are normally sent as the difference
+ to the previous value are instead sent as-is. This packet type
+ is only sent as the response to a header request from the
+ decompressor. It must not be sent as the result of a
+ retransmission.
+
+ In addition to the packet types used for compression, regular IPv4
+ and IPv6 packets are used whenever a compressor decides to not
+ compress a packet. An additional packet type may be used to speed up
+ repair of TCP streams over links where the decompressor can send
+ packets to the compressor.
+
+ CONTEXT_STATE - indicates a special packet sent from the
+ decompressor to the compressor to communicate a list of (TCP)
+ CIDs for which synchronization has been lost. This packet is only
+ sent over a single link so it requires no IP header. The format
+ is shown in section 10.2.
+
+3.2. Lost packets in TCP packet streams
+
+ Since TCP headers are compressed using the difference from the
+ previous TCP header, loss of a packet with a compressed or full
+ header will cause subsequent compressed headers to be decompressed
+ incorrectly because the context used for decompression was not
+ incremented properly.
+
+ Loss of a compressed TCP header will cause the TCP sequence numbers
+ of subsequently decompressed TCP headers to be off by k, where k is
+ the size of the lost segment. Such incorrectly decompressed TCP
+ headers will be discarded by the TCP receiver as the TCP checksum
+ reliably catches "off-by-k" errors in the sequence numbers for
+ plausible k.
+
+ TCP's repair mechanisms will eventually retransmit the discarded
+ segment and the compressor peeks into the TCP headers to detect when
+ TCP retransmits. When this happens, the compressor sends a full
+ header on the assumption that the retransmission was due to
+ mismatching compression state at the decompressor. [RFC-1144] has a
+ good explanation of this mechanism.
+
+ The mechanisms of section 10 should be used to speed up the repair of
+ the context. This is important over medium speed links with high
+ packet loss rates, for example wireless. Losing a timeout's worth of
+ packets due to inconsistent context after each packet lost over the
+ link is not acceptable, especially when the TCP connection is over
+ the wide area.
+
+
+
+
+Degermark, et. al. Standards Track [Page 9]
+
+RFC 2507 IP Header Compression February 1999
+
+
+3.3. Lost packets in UDP and other non-TCP packet streams
+
+ Incorrectly decompressed headers of UDP packets and other non-TCP
+ packets are not so well-protected by checksums as TCP packets. There
+ are no sequence numbers that become "off-by-k" and virtually
+ guarantees a failed checksum as there are for TCP. The UDP checksum
+ only covers payload, UDP header, and pseudo header. The pseudo
+ header includes the source and destination addresses, the transport
+ protocol type and the length of the transport packet. Except for
+ those fields, large parts of the IPv6 header are not covered by the
+ UDP checksum. Moreover, other non-TCP headers lack checksums
+ altogether, for example fragments.
+
+ In order to safely avoid incorrect decompression of non-TCP headers,
+ each version of the context for non-TCP packet streams is identified
+ by a generation, a small number that is carried by the full headers
+ that establish and refresh the context. Compressed headers carry the
+ generation value of the context that were used to compress them.
+ When a decompressor sees that a compressed header carries a
+ generation value other than the generation of its context for that
+ packet stream, the context is not up to date and the packet must be
+ discarded or stored until a full header establishes correct context.
+
+ Differential coding is not used for non-TCP streams, so compressed
+ non-TCP headers do not change the context. Thus, loss of a
+ compressed header does not invalidate subsequent packets with
+ compressed headers. Moreover, the generation changes only when the
+ context of a full header is different from the context of the
+ previous full header. This means that losing a full header will make
+ the context of the decompressor obsolete only when the full header
+ would actually have changed the context.
+
+ The generation field is 6 bits long so the generation value repeats
+ itself after 64 changes to the context. To avoid incorrect
+ decompression after error bursts or other temporary disruptions, the
+ compressor must not reuse the same generation value after a shorter
+ time than MIN_WRAP seconds. A decompressor which has been
+ disconnected MIN_WRAP seconds or more must wait for the next full
+ header before decompressing. A compressor must wait at least MIN_WRAP
+ seconds after booting before compressing non-TCP headers. Instead of
+ reusing a generation value too soon, a compressor may switch to
+ another CID or send regular headers until MIN_WRAP seconds have
+ passed. The value of MIN_WRAP is found in section 14.
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 10]
+
+RFC 2507 IP Header Compression February 1999
+
+
+3.3.1. Compression Slow-Start
+
+ To allow the decompressor to recover quickly from loss of a full
+ header that would have changed the context, full headers are sent
+ periodically with an exponentially increasing period after a change
+ in the context. This technique avoids an exchange of messages between
+ compressor and decompressor used by other compression schemes, such
+ as in [RFC-1553]. Such exchanges can be costly for wireless mobiles
+ as more power is consumed by the transmitter and delay can be
+ introduced by switching between sending and receiving. Moreover,
+ techniques that require an exchange of messages cannot be used over
+ simplex links, such as direct-broadcast satellite channels or cable
+ TV systems, and are hard to adapt to multicast over multi-access
+ links.
+
+ |.|..|....|........|................|..............................
+ ^
+ Change Sent packets: | with full header, . with compressed header
+
+ The picture shows how packets are sent after change. The compressor
+ keeps a variable for each non-TCP packet stream, F_PERIOD, that keeps
+ track of how many compressed headers may be sent between full
+ headers. When the headers of a non-TCP packet stream change so that
+ its context changes, a full header is sent and F_PERIOD is set to
+ one. After sending F_PERIOD compressed headers, a full header is
+ sent. F_PERIOD is doubled each time a full header is sent during
+ compression slow-start.
+
+3.3.2. Periodic Header Refreshes
+
+ To avoid losing too many packets if a receiver has lost its context,
+ there is an upper limit, F_MAX_PERIOD, on the number of non-TCP
+ packets with compressed headers that may be sent between header
+ refreshes. If a packet is to be sent and F_MAX_PERIOD compressed
+ headers have been sent since the last full header for this packet
+ stream was sent, a full header must be sent.
+
+ To avoid long periods of disconnection for low data rate packet
+ streams, there is also an upper bound, F_MAX_TIME, on the time
+ between full headers in a non-TCP packet stream. If a packet is to be
+ sent and more than F_MAX_TIME seconds have passed since the last full
+ header was sent for this packet stream, a full header must be sent.
+ The values of F_MAX_PERIOD and F_MAX_TIME are found in section 14.
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 11]
+
+RFC 2507 IP Header Compression February 1999
+
+
+3.3.3. Rules for sending Full Headers
+
+ The following pseudo code can be used by the compressor to determine
+ when to send a full header for a non-TCP packet stream. The code
+ maintains two variables:
+
+ C_NUM -- a count of the number of compressed headers sent
+ since the last full header was sent.
+ F_LAST -- the time of sending the last full header.
+
+ and uses the functions
+
+ current_time() return the current time
+ min(a,b) return the smallest of a and b
+
+ the procedures send_full_header(), increment_generation_value(),
+ and send_compressed_header()
+ do the obvious thing.
+
+ if ( <this header changes the context> )
+
+ C_NUM := 0;
+ F_LAST := current_time();
+ F_PERIOD := 1;
+ increment_generation_value();
+ send_full_header();
+
+ elseif ( C_NUM >= F_PERIOD )
+
+ C_NUM := 0;
+ F_LAST := current_time();
+ F_PERIOD := min(2 * F_PERIOD, F_MAX_PERIOD);
+ send_full_header();
+
+ elseif ( current_time() > F_LAST + F_MAX_TIME )
+
+ C_NUM := 0;
+ F_LAST := current_time();
+ send_full_header();
+
+ else
+
+ C_NUM := C_NUM + 1
+ send_compressed_header();
+
+ endif
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 12]
+
+RFC 2507 IP Header Compression February 1999
+
+
+3.3.4. Cost of sending Header Refreshes
+
+ If every f'th packet carries a full header, H is the size of a full
+ header, and C is the size of a compressed header, the average header
+ size is
+
+ (H-C)/f + C
+
+ For f > 1, the average header size is (H-C)/f larger than a
+ compressed header.
+
+ In a diagram where the average header size is plotted for various f
+ values, there is a distinct knee in the curve, i.e., there is a limit
+ beyond which further increasing f gives diminishing returns.
+ F_MAX_PERIOD should be chosen to be a frequency well to the right of
+ the knee of the curve. For typical sizes of H and C, say 48 octets
+ for the full header (IPv6/UDP) and 4 octets for the compressed
+ header, setting F_MAX_PERIOD > 44 means that full headers will
+ contribute less than an octet to the average header size. With a
+ four-address routing header, F_MAX_PERIOD > 115 will have the same
+ effect.
+
+ The default F_MAX_PERIOD value of 256 (section 14) puts the full
+ header frequency well to the right of the knee and means that full
+ headers will typically contribute considerably less than an octet to
+ the average header size. For H = 48 and C = 4, full headers
+ contribute about 1.4 bits to the average header size after reaching
+ the steady-state header refresh frequency determined by the default
+
+ F_MAX_PERIOD. 1.4 bits is a very small overhead.
+
+ After a change in the context, the exponential backoff scheme will
+ initially send full headers frequently. The default F_MAX_PERIOD
+ will be reached after nine full headers and 255 compressed headers
+ have been sent. This is equivalent to a little over 5 seconds for a
+ typical voice stream with 20 ms worth of voice samples per packet.
+
+ During the whole backoff period, full headers contribute 1.5 octets
+ to the average header size when H = 48 and C = 4. For 20 ms voice
+ samples, it takes less than 1.3 seconds until full headers contribute
+ less than one octet to the average header size, and during these
+ initial 1.3 seconds full headers add less than 4 octets to the
+ average header size. The cost of the exponential backoff is not
+ great and as the headers of non-TCP packet streams are expected to
+ change seldomly, it will be amortized over a long time.
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 13]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ The cost of header refreshes in terms of bandwidth are higher than
+ similar costs for hard state schemes like [RFC-1553] where full
+ headers must be acknowledged by the decompressor before compressed
+ headers may be sent. Such schemes typically send one full header plus
+ a few control messages when the context changes. Hard state schemes
+ require more types of protocol messages and an exchange of messages
+ is necessary. Hard state schemes also need to deal explicitly with
+ various error conditions that soft state handles automatically, for
+ instance the case of one party disappearing unexpectedly, a common
+ situation on wireless links where mobiles may go out of range of the
+ base station.
+
+ The major advantage of the soft state scheme is that no handshakes
+ are needed between compressor and decompressor, so the scheme can be
+ used over simplex links. The costs in terms of bandwidth are higher
+ than for hard state schemes, but the simplicity of the decompressor,
+ the simplicity of the protocol, and the lack of handshakes between
+ compressor and decompressor justifies this small cost. Moreover, soft
+ state schemes are more easily extended to multicast over multi-access
+ links, for example radio links.
+
+4. Grouping packets into packet streams
+
+ This section explains how packets MAY be grouped together into packet
+ streams for compression. To achieve the best compression rates,
+ packets SHOULD be grouped together such that packets in the same
+ packet stream have similar headers. If this grouping fails, header
+ compression performance will be bad, since the compression algorithm
+ can rarely utilize the existing context for the packet stream and
+ full headers must be sent frequently.
+
+ Grouping is done by the compressor. A compressor may use whatever
+ criterion it finds appropriate to group packets into packet streams.
+ To determine what packet stream a packet belongs to, a compressor MAY
+
+ a) examine the compressible chain of subheaders (see section 7),
+
+ b) examine the contents of an upper layer protocol header that
+ follows the compressible chain of subheaders, for example ICMP
+ headers, DVMRP headers, or tunneled IPX headers,
+
+ c) use information obtained from a resource manager, for example if a
+ resource manager requests compression for a particular packet
+ stream and provides a way to identify packets belonging to that
+ packet stream,
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 14]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ d) use any other relevant information, for example if routes flap and
+ the hop limit (TTL) field in a packet stream changes frequently
+ between n and n+k, a compressor may choose to group the packets
+ into two different packet streams.
+
+ A compressor is also free not to group packets into packet streams
+ for compression, letting some packets keep their regular headers and
+ passing them through unmodified.
+
+ As long as the rules for when to send full headers for a non-TCP
+ packet stream are followed and subheaders are compressed as specified
+ in this document, the decompressor is able to reconstruct a
+ compressed header correctly regardless of how packets are grouped
+ into packet streams.
+
+4.1 Guidelines for grouping packets
+
+ In this section we give OPTIONAL guidelines for how a compressor may
+ group packets into packet streams for compression.
+
+ Defining fields
+
+ The defining fields of a header should be present and identical in
+ all packets belonging to the same packet stream. These fields are
+ marked DEF in section 7. The defining fields include the flow
+ label, source and destination addresses of IP headers, final
+ destination address in routing headers, the next header fields
+ (for IPv6), the protocol field (IPv4), port numbers (UDP and TCP),
+ and the SPI in authentication and encryption headers.
+
+ Fragmented packets
+
+ Fragmented and unfragmented packets should never be grouped
+ together in the same packet stream. The Identification field of
+ the Fragment header or IPv4 header should not be used to identify
+ the packet stream. If it was, the first fragment of a new packet
+ would cause a compression slow-start.
+
+ No field after a Fragment Header, or an IPv4 header for a
+ fragment, should be used for grouping purposes.
+
+ Upper protocol identification
+
+ The first next header field identifying a header not described in
+ section 7 should be used for identifying packet streams, i.e., all
+ packets with the same DEF fields and the same upper protocol
+ should be grouped together.
+
+
+
+
+Degermark, et. al. Standards Track [Page 15]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ TTL field (Hop Limit field)
+
+ A sophisticated implementation might monitor the TTL (Hop Limit)
+ field and if it changes frequently use it as a DEF field. This can
+ occur when there are frequent route flaps so that packets traverse
+ different paths through the internet.
+
+ Traffic Class field (IPv6), Type of Service field (IPv4)
+
+ It is possible that the Traffic Class field of the IPv6 header and
+ the Type of Service of the IPv4 header will change frequently
+ between packets with otherwise identical DEF fields. A
+ sophisticated implementation should watch out for this and be
+ prepared to use these fields as defining fields.
+
+ When IP packets are tunneled they are encapsulated with an additional
+ IP header at the tunnel entry point and then sent to the tunnel
+ endpoint. To group such packets into packet streams, the inner
+ headers should also be examined to determine the packet stream. If
+ this is not done, full headers will be sent each time the headers of
+ the inner IP packet changes. So when a packet is tunneled, the
+ identifying fields of the inner subheaders should be considered in
+ addition to the identifying fields of the initial IP header.
+
+ An implementation can use other fields for identification than the
+ ones described here. If too many fields are used for identification,
+ performance might suffer because more CIDs will be used and the wrong
+ CIDs might be reused when new flows need CIDs. If too few fields are
+ used for identification, performance might suffer because there are
+ too frequent changes to the context.
+
+ We stress that these guidelines are educated guesses. When IPv6 is
+ widely deployed and IPv6 traffic can be analyzed, we might find that
+ other grouping algorithms perform better. We also stress that if the
+ grouping fails, the result will be bad performance but not incorrect
+ decompression. The decompressor can do its task regardless of how the
+ grouping algorithm works.
+
+5. Size Issues
+
+5.1. Context Identifiers
+
+ Context identifiers can be 8 or 16 bits long. Their size is not
+ relevant for finding the context. An 8-bit CID with value two and a
+ 16-bit CID with value two are equivalent.
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 16]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ The CID spaces for TCP and non-TCP are separate, so a TCP CID and a
+ non-TCP CID never identify the same context. Even if they have the
+ same value. This doubles the available CID space while using the same
+ number of bits for CIDs. It is always possible to tell whether a
+ full or compressed header is for a TCP or non-TCP packet, so no
+ mixups can occur.
+
+ Non-TCP compressed headers encode the size of the CID using one bit
+ in the second octet of the compressed header. The 8-bit CID allows a
+ minimum compressed header size of 2 octets for non-TCP packets, the
+ CID uses the first octet and the size bit and the 6-bit Generation
+ value fit in the second octet.
+
+ For TCP the only available CID size is 8 bits as in [RFC-1144]. 8
+ bits is probably sufficient as TCP connections are always point-to-
+ point.
+
+ The 16 bit CID size may not be needed for point-to-point links; it is
+ intended for use on multi-access links where a larger CID space may
+ be needed for efficient selection of CIDs.
+
+ The major difficulty with multi-access links is that several
+ compressors share the CID space of a decompressor. CIDs can no
+ longer be selected independently by the compressors as collisions may
+ occur. This problem may be resolved by letting the decompressors
+ have a separate CID space for each compressor. Having separate CID
+ spaces requires that decompressors can identify which compressor sent
+ the compressed packet, perhaps by utilizing link-layer information as
+ to who sent the link-layer frame. If such information is not
+ available, all compressors on the multi-access link may be
+ enumerated, automatically or otherwise, and supply their number as
+ part of the CID. This latter method requires a large CID space.
+
+5.2. Size of the context
+
+ The size of the context SHOULD be limited to simplify implementation
+ of compressor and decompressor, and put a limit on their memory
+ requirements. However, there is no upper limit on the size of an
+ IPv6 header as the chain of extension headers can be arbitrarily
+ long. This is a problem as the context is essentially a stored
+ header.
+
+ The configurable parameter MAX_HEADER (see section 14) represents the
+ maximum size of the context, expressed as the maximum sized header
+ that can be stored as context. When a header is larger than
+ MAX_HEADER, only part of it is stored as context. An implementation
+ MUST NOT compress more than the initial MAX_HEADER octets of a
+ header. An implementation MUST NOT partially compress a subheader.
+
+
+
+Degermark, et. al. Standards Track [Page 17]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ Thus, the part of the header that is stored as context and is
+ compressed is the longest initial sequence of entire subheaders that
+ is not larger than MAX_HEADER octets.
+
+5.3. Size of full headers
+
+ It is desirable to avoid increasing the size of packets with full
+ headers beyond their original size, as their size may be optimized
+ for the MTU of the link. Since we assume that the link layer
+ implementation provides the length of packets, we can use the length
+ fields in full headers to pass the values of the CID and the
+ generation to the decompressor.
+
+ This requires that the link-layer must not add padding to the
+ payload, at least not padding that can be delivered to the
+ destination link user. It is also required that no extra padding is
+ added after UDP data or in tunneled packets. This allows values of
+ length fields to be calculated from the length of headers and the
+ length of the link-layer frame.
+
+ The generation requires one octet and the CID may require up to 2
+ octets. There are length fields of 2 octets in the IPv6 Base Header,
+ the IPv4 header, and the UDP header.
+
+ A full TCP header will thus have at least 2 octets available in the
+ IP header to pass the 8 bit CID, which is sufficient. There will be
+ more than two octets available if there is more than one IP header.
+
+ [RFC-1144] uses the 8 bit Protocol field of the IPv4 header to pass
+ the CID. We cannot use the corresponding method as the sequence of
+ IPv6 extension headers is not fixed and CID values are not disjoint
+ from the legal values of Next Header fields.
+
+ An IPv6/UDP or IPv4/UDP packet will have 4 octets available to pass
+ the generation and the CID, so all CID sizes may be used. Fragmented
+ or encrypted packet streams may have only 2 octets available to pass
+ the generation and CID. Thus, 8-bit CIDs may be the only CID sizes
+ that can be used for such packet streams. When IPv6/IPv4 or
+ IPv4/IPv6 tunneling is used, there will be at least 4 octets
+ available, and both CID sizes may be used.
+
+ The generation value is passed in the higher order octet of the first
+ length field in the full header. When only one length field is
+ available, the 8-bit CID is passed in the low order octet. When two
+ length fields are available, the lowest two octets of the CID are
+ passed in the second length field and the low order octet of the
+ first length field carries the highest octet of the CID.
+
+
+
+
+Degermark, et. al. Standards Track [Page 18]
+
+RFC 2507 IP Header Compression February 1999
+
+
+5.3.1. Use of length fields in full TCP headers
+
+ Use of first length field:
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Length field | LSB of pkt nr | CID |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Use of second length field if available:
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Second length field | MSB of pkt nr | 0 |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Pkt nr is short for packet sequence number, described in section
+ 11.2.
+
+5.3.2. Use of length fields in full non-TCP headers
+
+ Full non-TCP headers with 8-bit CID:
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ First length field |0|D| Generation| CID |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Second length field (if avail.) | 0 | Data (if D=1) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Full non-TCP headers with 16-bit CID:
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ First length field |1|D| Generation| Data (if D=1) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Second length field | CID |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ The first bit in the first length field indicates the length of the
+ CID. The Data field is zero if D is zero. The use of the D bit and
+ Data field is explained in section 12.
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 19]
+
+RFC 2507 IP Header Compression February 1999
+
+
+6. Compressed Header Formats
+
+ This section uses some terminology (DELTA, RANDOM) defined in section
+ 7.
+
+ a) COMPRESSED_TCP format (similar to [RFC 1144]):
+
+ +-+-+-+-+-+-+-+-+
+ | CID |
+ +-+-+-+-+-+-+-+-+
+ |R O I P S A W U|
+ +-+-+-+-+-+-+-+-+
+ | |
+ + TCP Checksum +
+ | |
+ +-+-+-+-+-+-+-+-+
+ | RANDOM fields, if any (see section 7) (implied)
+ - - - - - - - -
+ | R-octet | (if R=1)
+ - - - - - - - -
+ | Urgent Pointer Value (if U=1)
+ - - - - - - - -
+ | Window Delta (if W=1)
+ - - - - - - - -
+ | Acknowledgment Number Delta (if A=1)
+ - - - - - - - -
+ | Sequence Number Delta (if S=1)
+ - - - - - - - -
+ | IPv4 Identification Delta (if I=1)
+ - - - - - - - -
+ | Options (if O=1)
+ - - - - - - - -
+
+
+ The latter flags in the second octet (IPSAWU) have the same meaning
+ as in [RFC-1144], regardless of whether the TCP segments are carried
+ by IPv6 or IPv4. The C bit has been eliminated because the CID is
+ always present. The context associated with the CID keeps track of
+ the IP version and what RANDOM fields are present. The order between
+ delta fields specified here is exactly as in [RFC-1144]. An
+ implementation will typically scan the context from the beginning and
+ insert the RANDOM fields in order. The RANDOM fields are thus placed
+ before the DELTA fields of the TCP header in the same order as they
+ occur in the original uncompressed header.
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 20]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ The I flag is zero unless an IPv4 header immediately precedes the TCP
+ header. The combined IPv4/TCP header is then compressed as a unit as
+ described in [RFC-1144]. Identification fields in IPv4 headers that
+ are not immediately followed by a TCP header are RANDOM.
+
+ If the O flag is set, the Options of the TCP header were not the same
+ as in the previous header. The entire Option field are placed last in
+ the compressed TCP header.
+
+ If the R flag is set, there were differences between the context and
+ the Reserved field (6 bits) in the TCP header or bit 6 or 7 of the
+ TOS octet (Traffic Class octet) in a IPv4 header (IPv6 header) that
+ immediately precedes the TCP header. An octet with the actual values
+ of the Reserved field and bit 6 and 7 of the TOS or Traffic Class
+ field is then placed immediately after the RANDOM fields. Bits 0-5
+ of the passed octet is the actual value of the Reserved field, and
+ bits 6 and 7 are the actual values of bits 6 and 7 in the TOS or
+ Traffic Class field. If there is no preceding IP header, bits 6 and 7
+ are 0. The octet passed with the R flag MUST NOT update the context.
+
+ NOTE: The R-octet does not update the context because if it did, the
+ nTCP checksum would not guard the receiving TCP from erroneously
+ decompressed headers. Bits 6 and 7 of the TOS octet or Traffic Class
+ octet is expected to change frequently due to Explicit Congestion
+ Notification.
+
+ See section 7.12 and [RFC-1144] for further information on how to
+ compress TCP headers.
+
+ b) COMPRESSED_TCP_NODELTA header format
+
+ +-+-+-+-+-+-+-+-+
+ | CID |
+ +-+-+-+-+-+-+-+-+
+ | RANDOM fields, if any (see section 7) (implied)
+ +-+-+-+-+-+-+-+-+
+ | Whole TCP header except for Port Numbers
+ +-+-+-+-+-+-+-+-+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 21]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ c) Compressed non-TCP header, 8 bit CID:
+ 0 7
+ +-+-+-+-+-+-+-+-+
+ | CID |
+ +-+-+-+-+-+-+-+-+
+ |0|D| Generation|
+ +-+-+-+-+-+-+-+-+
+ | data | (if D=1)
+ - - - - - - - -
+ | RANDOM fields, if any (section 7) (implied)
+ - - - - - - - -
+
+ d) Compressed non-TCP header, 16 bit CID:
+ 0 7
+ +-+-+-+-+-+-+-+-+
+ | msb of CID |
+ +-+-+-+-+-+-+-+-+
+ |1|D| Generation|
+ +-+-+-+-+-+-+-+-+
+ | lsb of CID |
+ +-+-+-+-+-+-+-+-+
+ | data | (if D=1)
+ - - - - - - - -
+ | RANDOM fields, if any (section 7) (implied)
+ - - - - - - - -
+
+ The generation, CID and optional one octet data are followed by
+ relevant RANDOM fields (see section 7) as implied by the compression
+ state, placed in the same order as they occur in the original
+ uncompressed header, followed by the payload.
+
+7. Compression of subheaders
+
+ This section gives rules for how the compressible chain of subheaders
+ is compressed. These rules MUST be followed. Subheaders that may be
+ compressed include IPv6 base and extension headers, TCP headers, UDP
+ headers, and IPv4 headers. The compressible chain of subheaders
+ extends from the beginning of the header
+
+ a) up to but not including the first header that is not an IPv4
+ header, an IPv6 base or extension header, a TCP header, or a UDP
+ header, or
+
+ b) up to and including the first TCP header, UDP header, Fragment
+ Header, Encapsulating Security Payload Header, or IPv4 header for
+ a fragment,
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 22]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ whichever gives the shorter chain. For example, rules a) and b) both
+ fit a chain of subheaders that contain a Fragment Header and ends at
+ a tunneled IPX packet. Since rule b) gives a shorter chain, the
+ compressible chain of subheaders stops at the Fragment Header.
+
+ The following subsections are a systematic classification of how all
+ fields in subheaders are expected to change.
+
+ NOCHANGE The field is not expected to change. Any change means
+ that a full header MUST be sent to update the context.
+
+ DELTA The field may change often but usually the difference
+ from the field in the previous header is small, so that
+ it is cheaper to send the change from the previous value
+ rather than the current value. This type of compression
+ is only used for TCP packet streams.
+
+ RANDOM The field must be included "as-is" in compressed headers,
+ usually because it changes unpredictably.
+
+ INFERRED The field contains a value that can be inferred from
+ other values, for example the size of the frame carrying
+ the packet, and thus must not be included in the
+ compressed header.
+
+ The classification implies how a compressed header is constructed. No
+ field that is NOCHANGE or INFERRED is present in a compressed header.
+ A compressor obtains the values of NOCHANGE fields from the context
+ identified by the compression identifier, and obtains the values of
+ INFERRED fields from the link-layer implementation, e.g., from the
+ size of the link-layer frame, or from other fields, e.g., by
+ recalculating the IPv4 header checksum. DELTA fields are encoded as
+ the difference to the value in the previous packet in the same packet
+ stream. The decompressor must update the context by adding the value
+ in the compressed header to the value in its context. The result is
+ the proper value of the field. RANDOM fields must be sent "as-is" in
+ the compressed header. RANDOM fields must occur in the same order in
+ the compressed header as they occur in the full header.
+
+ Fields that may optionally be used to identify what packet stream a
+ packet belongs to according to section 4.1 are marked with the word
+ DEF. To a compressor using the optional guidelines from section 4.1,
+ any difference in corresponding DEF fields between two packets
+ implies that they belong to different packet streams. Moreover, if a
+ DEF field is present in one packet but not in another, the packets
+ belong to different packet streams.
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 23]
+
+RFC 2507 IP Header Compression February 1999
+
+
+7.1. IPv6 Header [IPv6, section 3]
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ |Version| Traffic Class | Flow Label |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Payload Length | Next Header | Hop Limit |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + Source Address +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + Destination Address +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Version NOCHANGE (DEF)
+ Traffic Class NOCHANGE (might be DEF, see sect 4.1)
+ (see also sect 6 a)
+ Flow Label NOCHANGE (DEF)
+ Payload Length INFERRED
+ Next Header NOCHANGE
+ Hop Limit NOCHANGE (might be DEF, see sect 4.1)
+ Source Address NOCHANGE (DEF)
+ Destination Address NOCHANGE (DEF)
+
+ The Payload Length field of encapsulated headers must correspond to
+ the length value of the encapsulating header. If not, the header
+ chain MUST NOT be compressed.
+
+ NOTE: If this the IP header closest to a TCP header, bit 7 of the
+ Traffic Class field can be passed using the R-flag of the compressed
+ TCP header. See section 6 a).
+
+ This classification implies that the entire IPv6 base header will be
+ compressed away.
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 24]
+
+RFC 2507 IP Header Compression February 1999
+
+
+7.2. IPv6 Extension Headers [IPv6, section 4]
+
+ What extension headers are present and the relative order of them is
+ not expected to change in a packet stream. Whenever there is a
+ change, a full packet header must be sent. All Next Header fields in
+ IPv6 base header and IPv6 extension headers are NOCHANGE.
+
+7.3. Options [IPv6, section 4.2]
+
+ The contents of Hop-by-hop Options and Destination Options extension
+ headers are encoded with TLV "options" (see [IPv6]):
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
+ | Option Type | Opt Data Len | Option Data
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
+
+ Option Type and Opt Data Len fields are assumed to be fixed for a
+ given packet stream, so they are classified as NOCHANGE. The Option
+ data is RANDOM unless specified otherwise below.
+
+ Padding
+
+ Pad1 option
+
+ +-+-+-+-+-+-+-+-+
+ | 0 |
+ +-+-+-+-+-+-+-+-+
+
+ Entire option is NOCHANGE.
+
+ PadN option
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
+ | 1 | Opt Data Len | Option Data
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
+
+ All fields are NOCHANGE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 25]
+
+RFC 2507 IP Header Compression February 1999
+
+
+7.4. Hop-by-Hop Options Header [IPv6, section 4.3]
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next Header | Hdr Ext Len | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
+ | |
+ . .
+ . Options .
+ . .
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Next Header NOCHANGE
+ Hdr Ext Len NOCHANGE
+
+ Options TLV coded values and padding.
+ Classified according to 7.3 above, unless
+ being a Jumbo Payload option (see below).
+
+ Jumbo Payload option
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | 194 |Opt Data Len=4 |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Jumbo Payload Length |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ First two fields are NOCHANGE and Jumbo Payload Length INFERRED.
+ (frame length must be supplied by link layer implementation).
+
+
+ NOTE: It is silly to compress the headers of a packet carrying a
+ Jumbo Payload Option since the relative header overhead is
+ negligible. Moreover, it is usually a bad idea to send such
+ large packets over low- and medium-speed links.
+
+7.5. Routing Header [IPv6, section 4.4]
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next Header | Hdr Ext Len | Routing Type | Segments Left |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ . .
+ . type-specific data .
+ . .
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ All fields of the Routing Header are NOCHANGE.
+
+
+
+Degermark, et. al. Standards Track [Page 26]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ If the Routing Type is not recognized, it is impossible to determine
+ the final Destination Address unless the Segments Left field has the
+ value zero, in which case the Destination Address is the final
+ Destination Address in the basic IPv6 header.
+
+ In the Type 0 Routing Header, the last address is DEF if (Segments
+ Left > 0).
+
+ Routing Headers are compressed away completely. This is a big win as
+ the maximum size of the Routing Header is 392 octets. Moreover, Type
+ 0 Routing Headers with one address, size 24 octets, are used by
+ Mobile IP.
+
+7.6. Fragment Header [IPv6, section 4.5]
+
+ The first fragment of a packet has Fragment Offset = 0 and the chain
+ of subheaders extends beyond its Fragment Header. If a fragment is
+ not the first (Fragment Offset not 0), there are no subsequent
+ subheaders (unless the chain of subheaders in the first fragment
+ didn't fit entirely in the first fragment).
+
+ Since packets may be reordered before reaching the compression point,
+ and some fragments may follow other routes through the network, a
+ compressor cannot rely on seeing the first fragment before other
+ fragments. This implies that information in subheaders following the
+ Fragment Header of the first fragment cannot be examined to determine
+ the proper packet stream for other fragments.
+
+ It is possible to design compression schemes that can compress
+ subheaders after the Fragment Header, at least in the first fragment,
+ but to avoid complicating the rules for sending full headers and the
+ rules for compression and decompression, the chain of subheaders that
+ follow a Fragment Header MUST NOT be compressed.
+
+ The fields of the Fragment Header are classified as follows.
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next Header | Reserved | Fragment Offset |Res|M|
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Identification |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Next Header NOCHANGE
+ Reserved NOCHANGE
+ Res RANDOM
+ M flag RANDOM
+ Fragment Offset RANDOM
+ Identification RANDOM
+
+
+
+Degermark, et. al. Standards Track [Page 27]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ This classification implies that a Fragment Header is compressed down
+ to 6 octets. The minimum IPv6 MTU is 1280 octets so most fragments
+ will be at least 1280 octets. Since the 6 octet overhead of the
+ compressed fragment header is amortized over a fairly large packet,
+ the additional complexity of more sophisticated compression schemes
+ is not justifiable.
+
+ NOTE: The Identification field is RANDOM instead of NOCHANGE
+ to avoid one compression slow-start per original packet.
+
+ Grouping of fragments according to the optional guidelines in
+ section4.1:
+
+ Fragments and unfragmented packets should not be grouped
+ together.
+
+ Port numbers cannot be used to identify the packet stream because
+ port numbers are not present in every fragment. To adhere to the
+ uniqueness rules for the Identification value, a fragmented
+ packet stream is identified by the combination of Source Address
+ and (final) Destination Address.
+
+ NOTE: The Identification value is NOT used to identify the
+ packet stream. This avoids using a new CID for each packet and
+ saves the cost of the associated compression slow-start. We
+ expect that the unfragmentable part of the headers will not
+ change too frequently, if it does thrashing may occur.
+
+7.7. Destination Options Header [IPv6, section 4.6]
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next Header | Hdr Ext Len | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
+ | |
+ . .
+ . Options .
+ . .
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Next Header NOCHANGE
+ Hdr Ext Len NOCHANGE
+
+ Options TLV coded values and padding.
+ Compressed according to 7.3 above.
+
+ The only Destination Options defined in [IPv6] are the padding
+ options.
+
+
+
+Degermark, et. al. Standards Track [Page 28]
+
+RFC 2507 IP Header Compression February 1999
+
+
+7.8. No Next Header [IPv6, section 4.7]
+
+ Covered by rules for IPv6 Header Extensions (7.2).
+
+7.9. Authentication Header [RFC-2402, section 3.2]
+
+ 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
+ +---------------+---------------+---------------+---------------+
+ | Next Header | Length | RESERVED |
+ +---------------+---------------+---------------+---------------+
+ | Security Parameters Index (SPI) |
+ +---------------+---------------+---------------+---------------+
+ | |
+ + Authentication Data (variable number of 32-bit words) |
+ | |
+ +---------------+---------------+---------------+---------------+
+
+ Next Header NOCHANGE
+ Length NOCHANGE
+ Reserved NOCHANGE
+ SPI NOCHANGE (DEF)
+ Authentication Data RANDOM
+
+ [RFC-1828] specifies how to do authentication with keyed MD5, the
+ authentication method all IPv6 implementations must support. For
+ this method, the Authentication Data is 16 octets.
+
+7.10. Encapsulating Security Payload Header [RFC-2406, section 3.1]
+
+ This header implies that the subsequent parts of the packet are
+ encrypted. Thus, no further header compression is possible on
+ subsequent headers as encryption is typically already performed when
+ the compressor sees the packet.
+
+ However, when the ESP Header is used in tunnel mode an entire IP
+ packet is encrypted, and the headers of that packet MAY be compressed
+ before the packet is encrypted at the entry point of the tunnel.
+ This means that it must be possible to feed an IP packet and its
+ length to the decompressor, as if it came from the link-layer. The
+ mechanisms for dealing with reordering described in section 11 MUST
+ also be used, as packets can be reordered in a tunnel.
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 29]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ +---------------+---------------+---------------+---------------+
+ | Security Association Identifier (SPI), 32 bits |
+ +===============+===============+===============+===============+
+ | Opaque Transform Data, variable length |
+ +---------------+---------------+---------------+---------------+
+
+ SPI NOCHANGE (DEF)
+ Opaque Transform Data RANDOM
+
+ Everything after the SPI is encrypted and is not compressed.
+
+7.11. UDP Header
+
+ The UDP header is described in [RFC-768].
+
+
+ The Next Header field (IPv6) or Protocol field (IPv4) in the
+ preceding subheader is DEF.
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Source Port | Destination Port |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Checksum |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Source Port NOCHANGE (DEF)
+ Destination Port NOCHANGE (DEF)
+ Length INFERRED
+ Checksum RANDOM, unless it is zero,
+ in which case it is NOCHANGE.
+
+ The Length field of the UDP header MUST match the Length field(s) of
+ preceding subheaders, i.e, there must not be any padding after the
+ UDP payload that is covered by the IP Length.
+
+ The UDP header is typically compressed down to 2 octets, the UDP
+ checksum. When the UDP checksum is zero (which it cannot be with
+ IPv6), it is likely to be so for all packets in the flow and is
+ defined to be NOCHANGE. This saves 2 octets in the compressed header.
+
+7.12. TCP Header
+
+ The TCP header is described in [RFC-793].
+
+ The Next Header field (IPv6) or Protocol field (IPv4) in the
+ preceding subheader is DEF.
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 30]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Source Port | Destination Port |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Sequence Number |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Acknowledgment Number |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Offset| Reserved |U|A|P|R|S|F| Window |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Checksum | Urgent Pointer |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Options | Padding |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ U, A, P, R, S, and F stands for Urg, Ack, Psh, Rst, Syn, and Fin.
+
+ There are two ways to compress the TCP header.
+
+7.12.1. Compressed with differential encoding
+
+ Source Port NOCHANGE (DEF)
+ Destination Port NOCHANGE (DEF)
+ Sequence Number DELTA
+ Acknowledgment Number DELTA
+ Offset NOCHANGE
+ Reserved DELTA (if differs from context,
+ set R-flag in flag octet
+ and send absolute value
+ as described in 6 a.)
+ Urg,Psh RANDOM (placed in flag octet)
+ Ack INFERRED to be 1
+ Rst,Syn,Fin INFERRED to be 0
+ Window DELTA (if change in Window,
+ set W-flag in flag octet
+ and send difference)
+ Checksum RANDOM
+ Urgent Pointer DELTA (if Urg is set, send
+ absolute value)
+ Options, Padding DELTA (if change in Options,
+ set O-flag and send
+ whole Options, Padding)
+
+ A packet with a TCP header compressed according to the above must be
+ indicated to be of type COMPRESSED_TCP. The compressed header is
+ described in section 6.
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 31]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ This method is essentially the differential encoding techniques of
+ Jacobson, described in [RFC-1144], the differences being the placement
+ of the compressed TCP header fields (see section 6), the use of the
+ O-flag, the use of the R-flag, and elimination of the C-flag. The
+ O-flag allows compression of the TCP header when the Timestamp option
+ is used and the Options fields changes with each header.
+
+ DELTA values (except for Reserved field and Options, Padding) MUST be
+ coded as in [RFC-1144]. A Reserved field value passed with the R-flag
+ MUST NOT update the context at compressor or decompressor.
+
+7.12.2. Without differential encoding
+
+ Source Port NOCHANGE (DEF)
+ Destination Port NOCHANGE (DEF)
+
+ (all the rest) RANDOM
+
+ The Identification field in a preceding IPv4 header is RANDOM.
+
+ A packet with a TCP header compressed according to the above must be
+ indicated to be of type COMPRESSED_TCP_NODELTA. It uses the same CID
+ space as COMPRESSED_TCP packets, and the header MUST be saved as
+ context. The compressed header is described in section 6.
+
+ This packet type can be sent as the response to a header request
+ instead of sending a full header, can be used over links that reorder
+ packets, and can be sent instead of a full header when there are
+ changes that cannot be represented by a compressed header. A
+ sophisticated compressor can switch to sending only
+ COMPRESSED_TCP_NODELTA headers when the packet loss frequency is high.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 32]
+
+RFC 2507 IP Header Compression February 1999
+
+
+7.13. IPv4 header [RFC-791, section 3.1]
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ |Version| IHL |Type of Service| Total Length |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Identification |Flags| Fragment Offset |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Time to Live | Protocol | Header Checksum |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Source Address |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Destination Address |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Options | Padding |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ There are two ways to compress the IPv4 header
+
+ a) If the IPv4 header is not for a fragment (MF flag is not set and
+ Fragment Offset is zero) and there are no options (IHL is 5), it
+ is classified as follows
+
+ Version NOCHANGE (DEF)
+ IHL NOCHANGE (DEF, must be 5)
+ Type of Service NOCHANGE (might be DEF, see sect 4.1)
+ (see also 6 a)
+ Total Length INFERRED (from link-layer implementation
+ or encapsulating IP header)
+
+ Identification DELTA/ (If the Protocol field has the
+ (value corresponding to TCP)
+ RANDOM (otherwise)
+
+ Flags NOCHANGE (MF flag must not be set)
+ Fragment Offset NOCHANGE (must be zero)
+ Time to Live NOCHANGE (might be DEF, see sect 4.1)
+ Protocol NOCHANGE
+ Header Checksum INFERRED (calculated from other fields)
+ Source Address NOCHANGE (DEF)
+ Destination Address NOCHANGE (DEF)
+ Options, Padding (not present)
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 33]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ Note: When a TCP header immediately follows, the IPv4 and TCP
+ header MUST be compressed as a unit as described in section 6.
+ Bits 6 and 7 of the Type of Service field (bits 14 and 15 of the
+ first word) can then be passed using the R-flag (see section 6
+ a).
+
+ b) If the IPv4 header is for a fragment (MF bit set or Fragment
+ Offset nonzero), or there are options (IHL > 5), all fields are
+ RANDOM (i.e., if the header is compressed all fields are sent
+ as-is and not compressed). This classification allows compression
+ of the tunnel header, but not the fragment header, when fragments
+ are tunneled. If the IPv4 header is for a fragment it ends the
+ compressible chain of subheaders, i.e., it must be the last
+ subheader to be compressed. If the IPv4 header has options but
+ is not for a fragment it does not end the compressible chain of
+ subheaders, so subsequent subheaders can be compressed.
+
+ A compressor that follows the optional guidelines of section 4.1 will
+ in case a) use the Version, Source Address and Destination Address to
+ define the packet stream, together with the fact that there are no
+ IPv4 options and that this is not a fragment.
+
+ Case b) can define two kinds of packet streams depending on whether
+ the IPv4 header is for a fragment or not.
+
+ If the IPv4 header in case b) is for a fragment, a compressor
+ following the optional guidelines will use that fact together with
+ the Version, Source Address, and Destination Address to determine the
+ packet stream.
+
+ If the IPv4 header in case b) is not for a fragment, it must have
+ options. A compressor following the optional guidelines will use that
+ fact, but not the size of the options, together with the Version,
+ Source Address, and Destination Address to determine the packet
+ stream.
+
+7.14. Minimal Encapsulation header [RFC-2004, section 3.1]
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Protocol |S| reserved | Header Checksum |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Original Destination Address |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ : (if present) Original Source Address :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+
+
+Degermark, et. al. Standards Track [Page 34]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ Protocol NOCHANGE
+ Original Source Address Present (S) NOCHANGE
+ reserved NOCHANGE
+ Header Checksum INFERRED (calculated from
+ other values)
+ Original Destination Address NOCHANGE
+ Original Source Address NOCHANGE (present only
+ if S=1)
+
+ This header is likely to be used by Mobile IP.
+
+8. Changing context identifiers
+
+ On a point-to-point link, the compressor has total knowledge of what
+ CIDs are in use at the decompressor and may change what CID a packet
+ stream uses or reuse CIDs at will.
+
+ Each non-TCP CID is associated with a context with a generation
+ value. To avoid too rapid generation wrap-around and potential
+ incorrect decompression, an implementation MUST avoid wrap-around of
+ the generation value in less than MIN_WRAP seconds (see section 14).
+
+ To aid in avoiding wrap-around, the generation value associated with
+ a CID MUST NOT be reset when changing to a new packet stream.
+ Instead, a compressor MUST increment the generation value by one when
+ using the CID for a new non-TCP packet stream.
+
+9. Rules for dropping or temporarily storing packets
+
+ When a decompressor receives a packet with a compressed TCP header
+ with CID C, it MUST be discarded when the context for C has not been
+ initialized by a full header.
+
+ When a decompressor receives a packet with a compressed non-TCP
+ header with CID C and generation G, the header must not be
+ decompressed using the current context when
+
+ a) the decompressor has been disconnected from the compressor for
+ more than MIN_WRAP seconds, because the context might be
+ obsolete even if it has generation G.
+
+ b) the context for C has a generation other than G.
+
+ In case a) and b) the packet may either be
+
+ i) discarded immediately, or else
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 35]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ ii) stored temporarily until the context is updated by a packet
+ with a full non-TCP header with CID C and generation G, after
+ which the header can be decompressed.
+
+ Packets stored in this manner MUST be discarded when
+
+ *) receiving full or compressed non-TCP headers with CID C
+ and a generation other than G,
+
+ *) the decompressor has not received packets with CID C in
+ the last MIN_WRAP seconds.
+
+ When full headers are lost, a decompressor can receive compressed
+ non-TCP headers with a generation value other than the generation of
+ its context. Rule ii) allows the decompressor to store such headers
+ until they can be decompressed using the correct context.
+
+10. Low-loss header compression for TCP
+
+ Since fewer bits are transmitted per packet with header compression,
+ the packet loss rate is lower with header compression than without,
+ for a fixed bit-error rate. This is beneficial for links with high
+ bit-error rates such as wireless links.
+
+ However, since TCP headers are compressed using differential
+ encoding, a single lost TCP segment can ruin an entire TCP sending
+ window because the context is not incremented properly at the
+ decompressor. Subsequent headers will therefore be decompressed to
+ be different than before compression and discarded by the TCP
+ receiver because the TCP checksum fails.
+
+ A TCP connection in the wide area where the last hop is over a
+ medium-speed lossy link, for example a wireless LAN, will then have
+ poor performance with traditional header compression because the
+ delay-bandwidth product is relatively large and the bit-error rate
+ relatively high. For a 2 Mbit/s wireless LAN and an end-to-end RTT of
+ 200 ms, the delay-bandwidth product is 50 kbyte. That is equivalent
+ to about 97 512-octet segments with compressed headers. Each loss
+ can thus be multiplied by a factor of 100.
+
+ This section describes two simple mechanisms for quick repair of the
+ context. With these mechanisms header compression will improve TCP
+ throughput over lossy links as well as links with low bit-error
+ rates.
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 36]
+
+RFC 2507 IP Header Compression February 1999
+
+
+10.1. The "twice" algorithm
+
+ The decompressor may compute the TCP checksum to determine if its
+ context is not updated properly. If the checksum fails, the error is
+ assumed to be caused by a lost segment that did not update the
+ context properly. The delta of the current segment is then added to
+ the context again on the assumption that the lost segment contained
+ the same delta as the current. By decompressing and computing the TCP
+ checksum again, the decompressor checks if the repair succeeded or if
+ the delta should be applied once more.
+
+ Analysis of traces of various TCP bulk transfers show that applying
+ the delta of the current segment one or two times will repair the
+ context for between 83 and 99 per cent of all single-segment losses
+ in the data stream. For the acknowledgment stream, the success rate
+ is smaller due to the delayed ack mechanism of TCP. The "twice"
+ mechanism repairs the context for 53 to 99 per cent of the losses in
+ the acknowledgment stream. A sophisticated implementation of this
+ idea would determine whether the TCP stream is an acknowledgment or
+ data stream and determine the segment size by observing the stream of
+ full and compressed headers. Trying deltas that are small multiples
+ of the segment size will result in even higher rates of successful
+ repairs for acknowledgment streams.
+
+10.2. Header Requests
+
+ The relatively low success rate for the "twice" algorithm for TCP
+ acknowledgment streams calls for an additional mechanism for
+ repairing the context at the decompressor. When the decompressor
+ fails to repair the context after a loss, the decompressor may
+ optionally request a full header from the compressor. This is
+ possible on links where the decompressor can identify the compressor
+ and send packets to it.
+
+ On such links, a decompressor may send a CONTEXT_STATE packet back to
+ the compressor to indicate that one or more contexts are invalid. A
+ decompressor SHOULD NOT transmit a CONTEXT_STATE packet every time a
+ compressed packet refers to an invalid context, but instead should
+ limit the rate of transmission of CONTEXT_STATE packets to avoid
+ flooding the reverse channel. A CONTEXT_STATE packet can indicate
+ that several contexts are out of date, this technique SHOULD be used
+ instead of sending several separate packets. The following diagram
+ shows the format of a CONTEXT_STATE packet.
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 37]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ 0 1 2 3 4 5 6 7
+ +---+---+---+---+---+---+---+---+
+ | TCP header request = 3 |
+ +---+---+---+---+---+---+---+---+
+ | CID count |
+ +---+---+---+---+---+---+---+---+
+ | CID |
+ +---+---+---+---+---+---+---+---+
+ | CID |
+ +---+---+---+---+---+---+---+---+
+ ...
+ +---+---+---+---+---+---+---+---+
+ | CID |
+ +---+---+---+---+---+---+---+---+
+
+ The first octet is a type code to allow the CONTEXT_STATE packet type
+ to be shared for other compression protocols that are (see [CRTP]) or
+ may be defined in parallel with this one. When used for TCP header
+ requests the type code has the value 3, and the remainder of the
+ packet is a sequence of CIDs preceded by a one-octet count of the
+ number of CIDs.
+
+ On receipt of a CONTEXT_STATE packet, the compressor MUST mark the
+ CIDs invalid to ensure that the next packet emitted in those packet
+ streams are FULL_HEADER or COMPRESSED_TCP_NODELTA packets.
+
+ Header requests are an optimization, so loss of a CONTEXT_STATE
+ packet does not affect the correct operation of TCP header
+ compression. When a CONTEXT_STATE packet is lost, eventually a new
+ one will be transmitted or TCP will timeout and retransmit. The big
+ advantage of using header requests is that TCP acknowledgment streams
+ can be repaired after a roundtrip-time over the lossy link. This
+ will typically avoid a TCP timeout and unnecessary retransmissions.
+ The lower packet loss rate due to smaller packets will then result in
+ higher throughput because the TCP window can grow larger between
+ losses.
+
+11. Links that reorder packets
+
+ Some links reorder packets, for example multi-hop radio links that
+ use deflection routing to route around congested nodes. Packets
+ routed different ways can then arrive at the destination in a
+ different order than they were sent.
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 38]
+
+RFC 2507 IP Header Compression February 1999
+
+
+11.1. Reordering in non-TCP packet streams
+
+ Compressed non-TCP headers do not change the context, and neither do
+ full headers that refresh it. There can be problems only when a full
+ header that changes the context arrives out of order. There are two
+ cases:
+
+ - A packet with a full header with generation G arrives *after*
+ a packet with a compressed header with generation G. This case
+ is covered by rule b) ii) in section 9.
+
+ - A packet with a full header with generation G arrives *before*
+ a packet with a compressed header with generation G-1 (modulo
+ 64). The decompressor MAY then keep both versions of the
+ context around for a while to be able to decompress subsequent
+ compressed headers with generation G-1 (modulo 64). The old
+ context MUST be discarded after MIN_WRAP seconds.
+
+11.2. Reordering in TCP packet streams
+
+ A compressor may avoid sending COMPRESSED_TCP headers and only send
+ COMPRESSED_TCP_NODELTA headers when there is reordering over the
+ link. Compressed headers will typically be 17 octets with that
+ method, significantly larger than the usual 4-7 octets.
+
+ To achieve better compression rates the following method, adding only
+ two octets to the compressed header for a total of 6-9 octets, may be
+ used. A packet sequence number, incremented by one for every packet
+ in the TCP stream, is then associated with each compressed and full
+ header. This allows the decompressor to place the packets in the
+ correct sequence and apply their deltas to the context in the correct
+ order. A simple sliding window scheme is used to place the packets
+ in the correct order.
+
+ Two octets are needed for the packet sequence numbers. One octet
+ gives only 256 sequence numbers. In a sliding window scheme the
+ window should be no larger than half of the sequence number space, so
+ packets can not arrive more than 127 positions out-of-sequence. This
+ is equivalent to a delay of 260 ms on 2 Mbit/s links with 512 octet
+ segments. Delays of that order are not uncommon over wide-area
+ Internet connections. However, two octets giving 2^16 = 65536 values
+ should be sufficient.
+
+ Full TCP/IP headers will only have space for one octet of sequence
+ number when there is no tunneling. It is not feasible to increase the
+ size of full headers since the packet size might be optimized for the
+ MTU of the link. Therefore only the least significant octet of the
+ packet sequence number can be placed in such full headers. We believe
+
+
+
+Degermark, et. al. Standards Track [Page 39]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ that such full headers can be positioned correctly frequently enough
+ with only the least significant octet of the packet sequence number
+ available.
+
+ The packet sequence number zero MUST be skipped over. Avoiding zero
+ takes care of a problem that can occur when the TCP window scale
+ option is used to enlarge the TCP window. When exactly 2^16 octets of
+ TCP data is lost, a compressed header will be decompressed
+ incorrectly without being detected by the TCP checksum. TCP segment
+ sizes are often a power of two. So by using a packet sequence number
+ space that is not a power of two either the TCP sequence number or
+ the packet sequence number will differ when 2^16 octets are lost.
+ Whenever a compressor sees the window scale option on a SYN segment,
+ it MUST use packet sequence numbers when subsequently compressing
+ that packet stream.
+
+ In compressed TCP headers the two octet packet sequence number MUST
+ be placed immediately after the TCP Checksum. See section 5.3 for
+ placement of packet sequence numbers in full headers.
+
+12. Hooks for additional header compression
+
+ The following hook is supplied to allow additional header compression
+ schemes for headers on top of UDP. The initial chain of subheaders is
+ then compressed as described here, and the other header compression
+ scheme is applied to the header above the UDP header. An example of
+ such additional header compression is Compressed RTP by Casner and
+ Jacobson [CRTP]. To allow some error detection, such schemes
+ typically need a sequence number that may need to be passed in full
+ headers as well as compressed UDP headers.
+
+ The D-bit and Data octet (see section 6) provides the necessary
+ mechanism. When a sequence number, say, needs to be passed in a
+ FULL_HEADER or COMPRESSED_NON_TCP header, the D-bit is set and the
+ sequence number is placed in the Data field. The decompressor must
+ then extract and make the Data field available to the additional
+ header compression scheme.
+
+ Use of additional header compression schemes like CRTP must be
+ negotiated. The D-bit and Data octet mechanism must automatically be
+ enabled whenever use of additional header compression schemes has
+ been negotiated.
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 40]
+
+RFC 2507 IP Header Compression February 1999
+
+
+13. Demultiplexing
+
+ For each link layer, there must be a document specifying how the
+ various packet types used by IP header compression is indicated.
+ Such a document exists for PPP [PPP-HC]. This section gives OPTIONAL
+ guidelines on how packet types may be indicated by a specific link-
+ layer.
+
+ It is necessary to distinguish packets with regular IPv4 headers,
+ regular IPv6 headers, full IPv6 packets, full IPv4 packets,
+ compressed TCP packets, compressed non-TCP packets, and CONTEXT_STATE
+ packets.
+
+ The decision to use a distinct ethertype (or equivalent) for IPv6 has
+ already been taken, which means that link-layers must be able to
+ indicate that a packet is an IPv6 packet.
+
+ IP header compression requires that the link-layer implementation can
+ indicate four kinds of packets: COMPRESSED_TCP for format a) in
+ section 6, COMPRESSED_TCP_NODELTA for format b), COMPRESSED_NON_TCP
+ for formats c) and d), and CONTEXT_STATE as described in section
+ 11.2. It is also desirable to indicate FULL_HEADERS at the link
+ layer.
+
+ Full headers can be indicated by setting the first bit of the Version
+ field in a packet indicated to be an IPv6 packet. In addition, one
+ bit of the Version field is used to indicate if the first subheader
+ is an IPv6 or an IPv4 header, and one bit is used to indicate if this
+ full header carries a TCP CID or a non-TCP CID. The first four bits
+ are encoded as follows:
+
+ Version Meaning
+ ------- -------
+
+ 0110 regular IPv6 header
+
+ 1T*0 T=1 indicates a TCP header, T=0 indicates a non-TCP header
+ 1*V0 V=1 indicates a IPv6 header, V=0 indicates a IPv4 header
+
+ If a link-layer cannot indicate the packet types for the compressed
+ headers or CONTEXT_STATE, packet types that cannot be indicated could
+ start with an octet indicating the packet type, followed by the
+ header.
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 41]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ First octet Type of compressed header
+ ----------- -------------------------
+
+ 0 COMPRESSED_TCP
+ 1 COMPRESSED_TCP_NODELTA
+ 2 COMPRESSED_NON_TCP
+ 3 CONTEXT_STATE
+
+ The currently assigned CONTEXT_STATE type values are
+
+ Value Type Reference
+ ----- ----- ----------
+ 0 Reserved -
+ 1 IP/UDP/RTP w. 8-bit CID [CRTP]
+ 2 IP/UDP/RTP w. 16-bit CID [CRTP]
+ 3 TCP header request Section 10.2
+
+14. Configuration Parameters
+
+ Header compression parameters are negotiated in a way specific to the
+ link-layer implementation. Such procedures for link-layer xxx needs
+ to be specified in a document "IP header compression over xxx". Such
+ a document exists for PPP [PPP-HC].
+
+ The following parameter is fixed for all implementations of this
+ header compression scheme.
+
+ MIN_WRAP - minimum time of generation value wrap around
+
+ 3 seconds.
+
+ The following parameters can be negotiated between the compressor and
+ decompressor. If not negotiated their values must be as specified by
+ DEFAULT.
+
+ F_MAX_PERIOD - Largest number of compressed non-TCP headers that
+ may be sent without sending a full header.
+
+ DEFAULT is 256
+
+ F_MAX_PERIOD must be at least 1 and at most 65535.
+
+
+ F_MAX_TIME - Compressed headers may not be sent more than
+ F_MAX_TIME seconds after sending last full header.
+
+ DEFAULT is 5
+
+
+
+
+Degermark, et. al. Standards Track [Page 42]
+
+RFC 2507 IP Header Compression February 1999
+
+
+ F_MAX_TIME must be at least 1 and at most 255.
+
+ NOTE: F_MAX_PERIOD and F_MAX_TIME should be lower when it is
+ likely that a decompressor loses its state.
+
+
+ MAX_HEADER - The largest header size in octets that may
+ be compressed.
+
+ DEFAULT is 168 octets, which covers
+
+ - Two IPv6 base headers
+ - A Keyed MD5 Authentication Header
+ - A maximum-sized TCP header
+
+ MAX_HEADER must be at least 60 octets and
+ at most 65535 octets.
+
+
+ TCP_SPACE - Maximum CID value for TCP.
+
+ DEFAULT is 15 (which gives 16 CID values)
+
+ TCP_SPACE must be at least 3 and at most 255.
+
+
+ NON_TCP_SPACE - Maximum CID value for non-TCP.
+
+ DEFAULT is 15 (which gives 16 CID values)
+
+ NON_TCP_SPACE must be at least 3 and at most 65535.
+
+
+ EXPECT_REORDERING - The mechanisms in section 11 are used.
+
+ DEFAULT no.
+
+15. Implementation Status
+
+ A prototype using UDP as the link layer has been operational since
+ March 1996. A NetBSD implementation for PPP has been operational
+ since October 1996.
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 43]
+
+RFC 2507 IP Header Compression February 1999
+
+
+16. Acknowledgments
+
+ This protocol uses many ideas originated by Van Jacobson in the
+ design of header compression for TCP/IP over slow-speed links [RFC-
+ 1144]. It has benefited from discussions with Stephen Casner and
+ Carsten Bormann.
+
+ We thank Craig Partridge for pointing out a problem that can occur
+ when the TCP window scale option is used. A solution to this problem
+ relying on the packet sequence numbers used for reordering is
+ described in section 11.2.
+
+17. Security Considerations
+
+ The compression protocols in this document run on top of a link-layer
+ protocol. The compression protocols themselves introduce no new
+ additional vulnerabilities beyond those associated with the specific
+ link-layer technology being used.
+
+ Denial-of-service attacks are possible if an intruder can introduce
+ (for example) bogus Full Header packets onto the link. 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.
+
+ We advise implementors against identifying packet streams with the
+ aid of information that is encrypted, even if such information
+ happens to be available to the compressor. Doing so may expose
+ traffic patterns.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 44]
+
+RFC 2507 IP Header Compression February 1999
+
+
+18. Authors' Addresses
+
+ Mikael Degermark
+ Department of Computer Science and Electrical Engineering
+ Lulea University of Technology
+ SE-971 87 Lulea, Sweden
+
+ Phone: +46 920 91188
+ Fax: +46 920 72831
+ Mobile: +46 70 833 8933
+ EMail: micke@sm.luth.se
+
+
+ Bjorn Nordgren
+ CDT/Telia Research AB
+ Aurorum 6
+ S-977 75 Lulea, Sweden
+
+ Phone: +46 920 75400
+ Fax: +46 920 75490
+ EMail: bcn@lulea.trab.se, bcn@cdt.luth.se
+
+
+ Stephen Pink
+ Department of Computer Science and Electrical Engineering
+ Lulea University of Technology
+ SE-971 87 Lulea, Sweden
+
+ Phone: +46 920 752 29
+ Fax: +46 920 728 31
+ Mobile: +46 70 532 0007
+ EMail: steve@sm.luth.se
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 45]
+
+RFC 2507 IP Header Compression February 1999
+
+
+19. References
+
+ [RFC-768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
+ August 1980.
+
+ [RFC-791] Postel, J., "Internet Protocol", STD 5, RFC 791,
+ September 1981.
+
+ [RFC-793] Postel, J., "Transmission Control Protocol", STD 7,
+ RFC 793, September 1981.
+
+ [RFC-1144] Jacobson, V., "Compressing TCP/IP Headers for Low-
+ Speed Serial Links", RFC 1144, February 1990.
+
+ [RFC-1553] Mathur, A. and M. Lewis, "Compressing IPX Headers
+ Over WAN Media (CIPX)", RFC 1553, December 1993.
+
+ [RFC-1700] Reynolds, J. and J. Postel, "Assigned Numbers", STD
+ 2, RFC 1700, October 1994. See also:
+ http://www.iana.org/numbers.html
+
+ [RFC-2402] Kent, S. and R. Atkinson, "IP Authentication Header",
+ RFC 2402, November 1998.
+
+ [RFC-2406] Kent, S. and R. Atkinson, "IP Encapsulating Security
+ Protocol (ESP)", RFC 2406, November 1998.
+
+ [RFC-1828] Metzger, W., "IP Authentication using Keyed MD5", RFC
+ 1828, August 1995.
+
+ [IPv6] Deering, S. and R. Hinden, "Internet Protocol,
+ Version 6 (IPv6) Specification", RFC 2460, December
+ 1998.
+
+ [ICMPv6] Conta, A. and S. Deering, "Internet Control Message
+ Protocol (ICMPv6) for the Internet Protocol Version 6
+ (IPv6) Specification.", RFC 2463, December 1998.
+
+ [RFC-2004] Perkins, C., "Minimal Encapsulation within IP", RFC
+ 2004, October 1996.
+
+ [CRTP] Casner, S. and V. Jacobson, "Compressing IP/UDP/RTP
+ Headers for Low-Speed Serial Links", RFC 2508,
+ February 1999.
+
+ [PPP-HC] Engan, M., Casner, S. and C. Bormann, "IP Header
+ Compression for PPP", RFC 2509, February 1999.
+
+
+
+
+Degermark, et. al. Standards Track [Page 46]
+
+RFC 2507 IP Header Compression February 1999
+
+
+20. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ 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. .fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Degermark, et. al. Standards Track [Page 47]
+