Network Working Group Qian Zhang, (ed.), Microsoft Research Asia Internet Draft Robert Hancock, Siemens/Roke Manor Expires: July 2002 HongBin Liao, Microsoft Research Asia Stephen McCann, Siemens/Roke Manor Paul Ollis, Siemens/Roke Manor Richard Price, Siemens/Roke Manor Abigail Surtees, Siemens/Roke Manor Mark A West, Siemens/Roke Manor Ya-Qin Zhang, Microsoft Research Asia Wenwu Zhu, Microsoft Research Asia January, 2001 TCP/IP Header Compression for ROHC (ROHC-TCP) Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026 [RFC2026]. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet- Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsolete by other documents at any time. It is inappropriate to use Internet- Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. Abstract Existing TCP/IP header compression schemes do not work well on noisy links, especially the one with high bit error rate and long roundtrip time. For many bandwidth limited links where header compression is essential, such characteristics are common. In addition, existing schemes [VJHC, IPHC] have not addressed how to compress TCP options such as SACK [RFC2018, RFC2883] and Timestamps [RFC1323]. A robust and efficient header compression scheme for TCP/IP, called ROHC-TCP, is proposed within the basic RObust Header Compression [ROHC] framework. Zhang, et al. [Page 1] draft-ietf-rohc-tcp-00.txt Table of Contents Status of this Memo................................................1 Abstract...........................................................1 1. Introduction....................................................5 2. Terminology.....................................................5 3. Background......................................................7 3.1 Existing TCP/IP header compression schemes..................7 3.2 Classification of header fields.............................8 4. TCP/IP header compression framework.............................9 4.1 Compression and decompression states........................9 4.1.1 Compressor states......................................9 4.1.1.1. Initialization and Refresh (IR) state...........10 4.1.1.2. First Order (FO) State..........................11 4.1.1.3. Second Order (SO) State.........................12 4.1.2. Decompressor states..................................12 4.2 Modes of operation.........................................12 4.2.1. Unidirectional mode -- U-mode........................12 4.2.2. Bi-directional mode -- B-mode........................13 5. The Protocol...................................................13 5.1 TCP congestion window tracking.............................14 5.1.1. General principle of congestion window tracking......15 5.1.2. Congestion window tracking based on Sequence Number..15 5.1.3. Congestion window tracking based on Acknowledgment Number......................................................17 5.1.4. Further discussion on congestion window tracking.....18 5.2 Operation in unidirectional mode...........................18 5.2.1. Compressor logic.....................................19 5.2.1.1. IR state........................................19 5.2.1.2. FO state........................................20 5.2.1.3. SO state........................................21 5.2.2. Decompressor logic...................................21 5.2.2.1. No Context State................................21 5.2.2.2. Full Context State..............................22 5.3 Operations in bi-directional mode..........................22 5.3.1. Compressor states and logic..........................22 5.3.1.1 Master Sequence Number (MSN) for packet acknowledging............................................23 5.3.1.2 State transition logic...........................23 5.3.2. Decompressor states and logic........................23 5.4. Implementation issues.....................................24 5.4.1. Determine the value K................................24 5.4.2. Determine the value N................................24 5.4.3. Determine the frequency of updating context..........24 5.4.4. Possible optimization in U-mode......................25 5.5. Mode transitions..........................................26 5.5.1. Compression and decompression during mode transitions26 5.5.2. Transition from Unidirectional to Bidirectional mode.27 5.5.3. Transition to Unidirectional mode....................28 6. Coding Scheme and compressed packet header format..............28 6.1. Windowed LSB encoding and fixed-payload encoding..........29 6.2. The framework of EPIC-LITE scheme.........................29 6.3. ROHC Profile for compression of TCP/IP....................29 Zhang (ed.), et al. [Page 2] draft-ietf-rohc-tcp-00.txt 7. Security considerations.......................................40 8. Acknowledgements...............................................40 9. References.....................................................40 10. Authors' addresses............................................42 Appendix A - Detailed classification of header fields.............44 A.1. General classification....................................44 A.1.1. IP header fields.....................................45 A.1.1.1. IPv6 header fields..............................45 A.1.1.2. IPv4 header fields..............................46 A.1.2. TCP header fields....................................48 A.1.3. Summary for IP/TCP...................................49 A.2. Analysis of change patterns of header fields..............49 A.2.1. IP header fields.....................................52 A.2.1.1. IP Traffic-Class / Type-Of-Service (TOS)........52 A.2.1.2. ECN Flags.......................................52 A.2.1.3. IP Identification...............................53 A.2.1.4. Don't Fragment (DF) flag........................54 A.2.1.5. IP Hop-Limit / Time-To-Live (TTL)...............55 A.2.2. TCP header fields....................................55 A.2.2.1. Sequence number.................................55 A.2.2.2. Acknowledgement number..........................56 A.2.2.3. Reserved........................................56 A.2.2.4. Flags...........................................56 A.2.2.5. Checksum........................................58 A.2.2.6. Window..........................................58 A.2.2.7. Urgent pointer..................................58 A.2.3. Options..............................................58 A.2.3.1. Options overview................................59 A.2.3.2. Option field behavior...........................59 Zhang (ed.), et al. [Page 3] draft-ietf-rohc-tcp-00.txt Document History 00 January 31, 2002 First release. Zhang (ed.), et al. [Page 4] draft-ietf-rohc-tcp-00.txt 1. Introduction The necessity and importance of doing TCP/IP header compression on low- or medium-speed links have been discussed in [IPHC]. However, some links, such as cellular links, have characteristics that make header compression as defined in [IPHC, VJHC] perform less than well. The most important characteristic is the lossy behavior of cellular links, where a bit error rate (BER) as high as 1e-3 must be accepted to keep the radio resources efficiently utilized. In severe operating situations, the BER can be as high as 1e-2. The other problematic characteristic is the long round-trip time (RTT) of the cellular link. An additional issue that needs to be considered in TCP/IP header compression is how to efficiently compress the TCP options, such as SACK and Timestamp. Bandwidth is the most costly resource in cellular links. Processing power is very cheap in comparison. Implementation or computational simplicity of a header compression scheme is therefore of less importance than its compression ratio and robustness. This document describes a new header compression scheme for TCP/IP header compression (ROHC-TCP), which consists of two components, the state machine and the encoding mechanism. As stated in [EPIC], Efficient Protocol Independent Compression (EPIC-LITE) is a generic encoding scheme which can automatically generate efficient packet format for the compressed header. In this document, ROHC-TCP adopts EPIC-LITE as the encoding framework. By combining state machine and EPIC-LITE together, ROHC-TCP is more robust against packet loss and hence achieves better performance over lossy links. 2. Terminology The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119]. Compressed header format A compressed header format describes how to compress each field in the chosen protocol stack. It consists of two parts: a bit pattern to indicate to the decompressor which format is being used, followed by a list of the compressed versions of each field. Context The context is an array storing one or more previous values of each field in the uncompressed header. The compressor and compressor both maintain a copy of the context, and fields can be Zhang (ed.), et al. [Page 5] draft-ietf-rohc-tcp-00.txt compressed relative to their stored values for better compression efficiency. Context identifiers On some channels, the ability to transport multiple packet streams is required. It can also be feasible to have channels dedicated to individual packet streams. Therefore, ROHC uses a distinct context identifier space per channel and can eliminate context identifiers completely for one of the streams when few streams share a channel. Control field The term 'control field' refers to any field passed between the compressor and decompressor, that is not part of the uncompressed header. An example of a control field is the header checksum calculated by EPIC-LITE over the uncompressed header to ensure robustness against bit errors and dropped packets. Encoding method An encoding method is a procedure for compressing fields. Examples include STATIC encoding (field is the same as the context), INFERRED encoding (field is calculated at the decompressor) and IRREGULAR encoding (field must be transmitted in full). Indicator flags Each EPIC-LITE compressed packet contains a set of indicator flags. The flags are placed at the front of the packet as a single bit pattern, and indicate to the decompressor exactly which encoding method has been applied to which field. Input language EPIC-LITE offers a simple input language (2 commands) that can be used to create new ROHC profiles. The input language assigns one or more encoding methods to each field in the chosen protocol stack. Library of encoding methods The library of encoding methods contains a number of commonly used procedures that can be called to compress fields in the chosen protocol stack. More encoding methods can be added to the library if they are needed. Profile A [ROHC] profile is a description of how to compress a certain protocol stack over a certain type of link. Each profile includes Zhang (ed.), et al. [Page 6] draft-ietf-rohc-tcp-00.txt one or more sets of compressed header formats and a state machine to control the compressor and the decompressor. Set of compressed header formats A complete set of compressed header formats uses up all of the indicator bit patterns available at the start of the compressed header. A profile may have several sets of compressed header formats available, but only one set can be in use at a given time. 3. Background This chapter provides a background to the subject of TCP/IP header compression. The fundamentals of general header compression had been introduced in [ROHC]. Here two existing TCP/IP header compression schemes are described. Their drawbacks are then discussed, following by the classification of TCP/IP header fields. 3.1 Existing TCP/IP header compression schemes There are two typical existing TCP/IP header compression schemes, which are VJHC [VJHC] and IPHC [IPHC], respectively. Both of them rely on transmitting only the difference from the previous header in order to reduce the large overhead of TCP/IP header. Although VJHC works well over reliable links, when used over unreliable links, such as cellular links, it induces many additional errors due to inconsistent contexts between the compressor and the decompressor. Considering the high bit error rate in wireless channel, if a packet gets lost, the compressed header of next packet cannot be correctly decompressed. Then the decompressor must send the request for resynchronization and in the meanwhile discard all compressed header. A fatal result of this effect is that it prevents TCP Fast Retransmit algorithm [E2E] from being fired and always causes TCP retransmission timeout. This effect is shown in detail in [MOBI96]. IPHC proposes two simple mechanisms, the TWICE algorithm and the full header request mechanism, to reduce the errors due to the inconsistent contexts between the compressor and the decompressor. The TWICE algorithm assumes that only the Sequence Number field of TCP segments are changing during the connection and the deltas among consecutive packets are constant in most cases. However, these assumptions are not always true, especially when TCP Timestamp and SACK options are used. The full header request mechanism needs a feedback channel, which is unavailable in some circumstances. Even when the feedback channel is available, this mechanism still cannot perform well enough if the roundtrip time of this link is very long. Once a packet is corrupted on the noisy link, there are still several consecutive packets dropped due to the inconsistency between the compressor and the decompressor. Zhang (ed.), et al. [Page 7] draft-ietf-rohc-tcp-00.txt 3.2 Classification of header fields Header compression is possible due to the fact that there is much redundancy between header field values within packets, especially between consecutive packets. To utilize these properties for header compression, it is important to understand the change patterns of the various header fields. All header fields have been classified in detail in appendix A. The fields are first classified at a high level and then some of them are studied more in detail. Finally, the appendix concludes with recommendations on how the various fields should be handled by header compression algorithms. The main conclusion that can be drawn is that most of the header fields can easily be compressed away since they never or seldom change. Only several fields need more sophisticated mechanisms. These fields are: - IPv4 Identification (16 bits) - IP-ID - TCP Sequence Number (32 bits) - SN - TCP Acknowledgement Number (32 bits) - ACKN - TCP Reserved (4 bits) - TCP ECN flags (2 bits) - ECN - TCP Window (16 bits) - WINDOW - TCP SACK - SACK - TCP Timestamp (32 bits) - TS It is known that the change patterns of several TCP fields (for example, Sequence Number, Acknowledgement Number, Window, etc.) are completely different from the ones of RTP, which had already discussed in detail in [ROHC], and are very hard to predict. The analysis in Appendix A reveals that an understanding of the sequence and acknowledgement number behavior are essential for a TCP compression scheme. Note that at any point on the path (i.e. wherever a compressor might be deployed), the sequence number can be anywhere within a range defined by the TCP window. Missing packets or retransmissions can cause the TCP sequence number to fluctuate within the limits of this window. The jumps in acknowledgement number are also bounded by this TCP window. The way ROHC TCP compression operates, then, is to first track the TCP window by the compressor side, and then bound the size of jumps in SN and ACK by this estimated TCP window. The analysis in Appendix A also reveals that in the TCP case, there is no obvious candidate for a field to offer the Master sequence number to compress IP-ID field than in the RTP case. The assignment Zhang (ed.), et al. [Page 8] draft-ietf-rohc-tcp-00.txt of IP-ID values can be done in various ways, which are Sequential jump, Random, and Sequential, respectively. However, designers of IPv4 stacks for cellular terminals SHOULD use an assignment policy close to sequential. The way ROHC TCP compression operates, then, is to share the context among the short-live TCP flows so as to improve the compression efficiency. Headers specific to Mobile IP (for IPv4 or IPv6) do not receive any special treatment in this document. They are compressible, however, and it is expected that the compression efficiency for Mobile IP headers will be good enough due to the handling of extension header lists and tunneling headers. The handling of this issue is conforms with [ROHC]. 4. TCP/IP header compression framework Similar to the ROHC framework, the ROHC-TCP protocol achieves its compression gain by establishing state information at both ends of the link, i.e., at the compressor and at the decompressor. 4.1 Compression and decompression states Header compression with ROHC can be characterized as an interaction between two state machines, one compressor machine and one decompressor machine, each instantiated once per context. The compressor and the decompressor have three and two states, respectively. Both machines start in the lowest compression state and transit gradually to higher states. Transitions need not be synchronized between the two machines. In normal operation it is only the compressor that temporarily transits back to lower states. The decompressor will transit back only when context damage is detected. Subsequent sections present an overview of the state machines and their corresponding states, respectively, starting with the compressor. 4.1.1 Compressor states There are three compressor states in ROHC-TCP: Initialization and Refresh (IR) state, First Order (FO), and Second Order (SO) states. The compressor starts in the lowest compression state (IR) and transits gradually to the higher compression state. The compressor will always operate in the highest possible compression state, under the constraint that the compressor is sufficiently confident that Zhang (ed.), et al. [Page 9] draft-ietf-rohc-tcp-00.txt the decompressor has the information necessary to decompress a header, which is compressed according to the state. +----------+ | | +----------+ | FO State | +----------+ | | <--------> | | <--------> | | | IR State | +----------+ | SO State | | | <----------------------------------> | | +----------+ +----------+ 4.1.1.1. Initialization and Refresh (IR) state The purpose of IR state is to initialize or refresh the static parts of the context at the decompressor. In this state, the compressor sends full header periodically with an exponentially increasing period, which is so-called compression slow-start [IPHC]. The compressor leaves the IR state only when it is confident that the decompressor has correctly received the static information. 4.1.1.1.1 Optimization for short-live TCP transfers Two approaches are introduced in ROHC-TCP to compress short-lived TCP transfers more efficiently. The first approach is that the compressor should try to speed up the initialization process. This approach can be applied is the compressor is able to see the SYN packet. The compressor enters the IR state when it receives the packet with SYN bit set and sends IR packet. When it receives the first data packet of the transfer, it should transit to FO state because that means the decompressor has received the packet with SYN bit set and established the context successfully at its side. Using this mechanism can significantly reduce the number of context initiation headers. The second approach is to share the context among different short- lived TCP transfers so that to improve the compression efficiency. There are commonly cases where there will be multiple short-live TCP connections between the same cellular links. As a particular example, consider web browsing that can be illustrated in Figure 4.1.1.1.1. In this figure, the mobile terminal is connected to base station over cellular link, and the base station is connected to multiple web servers through wired (or possibly wireless) networks. Zhang (ed.), et al. [Page 10] draft-ietf-rohc-tcp-00.txt Mobile Base Web Terminal Station Servers +----------+ | ~ ~ ~ \ / ||============= | Server 1 | | | || +----------+ +--+ | || | | | || . . . . . . | | | || +--+ | || | || +----------+ |============||============= | Server n | +----------+ Cellular Wired Link Network Figure 4.1.1.1.1 : Scenario for web browsing over cellular links When a connection closes, it is either the last connection between that pair of hosts or it is likely that another connection will open within a relatively short space of time. In this case, the IP header part of the context will probably be almost identical. Certain aspects of the TCP context may also be similar. For example, it may be that one of the port numbers will stay the same (the service port) and the other will change by a small amount relative to the just-closed connection (the ephemeral port). Also, unless [RFC 1948] ISN selection is implemented, the initial sequence number for the SYN packet may be 'close' to the sequence number range used for the closed connection. Thus, ROHC-TCP provides sub-context sharing for multiple short-live TCP connections. The new connection initializes a new context, (partially) copied the context from an existing one, and send out PARTIAL-FULL header periodically with an exponentially increasing period. This PARTIAL-FULL header should indicate the existing context that can be shared with the new connection, and also the fields that need to be updated in the new context. 4.1.1.2. First Order (FO) State The purpose of FO state is to efficiently transmit the difference between the two consecutive packets in the TCP stream. When operating in this state, the compressor and the decompressor should have the same context. Only compressed packet is transmitted from Zhang (ed.), et al. [Page 11] draft-ietf-rohc-tcp-00.txt the compressor to the decompressor in this state. The compressor transits back to IR state only when it finds that the context of decompressor may be inconsistent, or there are remarkable changes in the TCP/IP header. 4.1.1.3. Second Order (SO) State The purpose of SO state is to efficiently transmit the fixed-payload data. The compressor enters this state when it is sufficiently confident that the decompressor has got the constant payload size of the data transferring. The compressor leaves this state and transits to the FO state when the current payload size no longer conforms to the constant payload. The compressor transits back to IR state only when it finds that the context of decompressor may be inconsistent, or there are remarkable changes in the TCP/IP header. 4.1.2. Decompressor states The decompressor starts in its lowest compression state, "No Context" and gradually transits to higher state, "Full Context". The decompressor state machine normally never leaves the "Full Context" state once it has entered this state. +--------------+ +--------------+ | No Context | <---> | Full Context | +--------------+ +--------------+ 4.2 Modes of operation There are two modes in ROHC-TCP, called Unidirectional and Bi- directional mode, respectively. The mode transitions are conformed to ROHC framework. However, the operations of each mode are different. 4.2.1. Unidirectional mode -- U-mode When in U-mode, packets are sent in one direction only: from compressor to decompressor. Therefore, feedbacks from decompressor to the compressor are unavailable under this mode. In the U-mode, the compressor and decompressor logic is the same as the discussion in section 5.3 and 5.4. Compression with ROHC-TCP MUST starts in the Unidirectional mode. Transition to the Bidirectional mode can be performed as soon as a packet has reached the decompressor and it has replied with a Zhang (ed.), et al. [Page 12] draft-ietf-rohc-tcp-00.txt feedback packet indicating that a mode transition is desired (see chapter 5). 4.2.2. Bi-directional mode -- B-mode The Bidirectional mode is similar to the Unidirectional mode. The difference is that a feedback channel is used to send error recovery requests and (optionally) acknowledgments of significant context updates from decompressor to compressor (not, however, for pure sequence number updates). In this mode, the number of context values can be reduced more efficiently. B-mode aims to maximize compression efficiency and sparse usage of the feedback channel. It reduces the number of damaged headers delivered to the upper layers due to residual errors or context invalidation. 5. The Protocol Considering the changing pattern of several TCP fields, Window-based LSB encoding [ROHC] or windowed LSB encoding [EPIC-LITE], which does not assume the linear changing pattern of the target header fields, is more suitable to encode those TCP fields both efficiently and robustly. Using EPIC-LITE, the compressor and decompressor maintain a context value for some or all of the "field encodings" specified in the BNF description. To provide robustness, the compressor can maintain more than one context value for each field. These values represent the r most likely candidates’ values for the context at the decompressor. EPIC-LITE ensures that the compressed header contains enough information so that the uncompressed header can be extracted no matter which one of the compressor context values is actually stored at the decompressor. The only problem arises if the decompressor has a context value that does not belong to the set of values stored at the compressor; this situation is detected by a checksum over the uncompressed header and the packet is discarded at the decompressor. If more than one value for a field is stored in the compressor context, LSB encoding will only succeed if sufficient LSBs are sent to infer correct value of the field regardless of the precise value stored in the decompressor context. Storing more context values at the compressor reduces the chance that the decompressor will have a context value different from any of the values stored at the compressor (which could cause the packet to be decompressed incorrectly). As an example, an implementation may choose to store the last r values of each field in the compressor context. In this case Zhang (ed.), et al. [Page 13] draft-ietf-rohc-tcp-00.txt robustness is guaranteed against up to r - 1 consecutive dropped packets between the compressor and the decompressor. Thus, by keeping the value r large enough, the compressor rarely gets out of synchronization with the decompressor. However, the trade-off is that the larger the number of context values is, the compressed header will be larger because it must contain enough information to decompress relative to any of the candidate context values. The main idea of the control mechanism of ROHC-TCP is the combination of the windowed LSB encoding and dynamically TCP congestion window tracking. With this combination, the value r can be controlled effectively. To reduce the number of context value r, the compressor needs some form of feedback to get sufficient confidence that a certain context value will not be used as a reference by the decompressor. Then the compressor can remove that value and all other values older than it from its context. Obviously, when a feedback channel is available, confidence can be achieved by proactive feedback in the form of ACKs from the decompressor. A feedback channel, however, is unavailable or expensive in some environments. In this Internet draft, a mechanism based on dynamically tracking TCP congestion window is proposed to explore such feedbacks from the nature feedback-loop of TCP protocol itself. Since TCP is a window-based protocol, a new segment cannot be transmitted without getting the acknowledgment of segment in the previous window. Upon receiving the new segment, the compressor can get enough confidence that the decompressor has received the segment in the previous window and then shrink the context window by removing all the values older than that segment. As originally outlined in [CAC] and specified in [RFC2581], TCP is incorporated with four congestion control algorithms: slow-start, congestion-avoidance, fast retransmit, and fast recovery. The effective window of TCP is mainly controlled by the congestion window and may change during the entire connection life. ROHC-TCP designs a mechanism to track the dynamics of TCP congestion window, and control the number of context value r of windowed LSB encoding by the estimated congestion window. By combining the windowed LSB encoding and TCP congestion window tracking, ROHC-TCP can achieve better performance over high bit-error-rate links. Note that in one-way TCP traffic, only the information about sequence number or acknowledgment number is available for tracking TCP congestion window. ROHC-TCP does not require that all one-way TCP traffics must cross the same compressor. The detail will be described in the following sections. 5.1 TCP congestion window tracking Zhang (ed.), et al. [Page 14] draft-ietf-rohc-tcp-00.txt 5.1.1. General principle of congestion window tracking The general principle of congestion window tracking is as follows. The compressor imitates the congestion control behavior of TCP upon receiving each segment, in the meantime, estimates the congestion window (cwnd) and the slow start threshold (ssthresh). Besides the requirement of accuracy, there are also some other requirements for the congestion window tracking algorithms: - Simplex link. The tracking algorithm SHOULD always only take Sequence Number or Acknowledgment Number of a one-way TCP traffic into consideration. It SHOULD NOT use Sequence Number and Acknowledgment Number of that traffic simultaneously. - Misordering resilience. The tracking algorithm SHOULD work well while receiving misordered segments. - Multiple-links. The tracking algorithm SHOULD work well when not all the one-way TCP traffics are crossing the same link. - Slightly overestimation. If the tracking algorithm cannot guarantee the accuracy of the estimated cwnd and ssthresh, it is RECOMMANDED that it produces a slightly overestimated one. The following sections will describe two congestion window tracking algorithms, which use Sequence Number and Acknowledgment Number of a one-way TCP traffic, respectively. 5.1.2. Congestion window tracking based on Sequence Number This algorithm (Algorithm SEQ) contains 3 states: SLOW-START, CONGESTION-AVOIDANCE, and FAST-RECOVERY, which are equivalent to the states in TCP congestion control algorithms. It maintains 2 variables: cwnd and ssthresh. +-------------+ | | ---------------->| CONGESTION- | | | AVOIDANCE | | ----| |<--- +------------+ | +-------------+ | | | | | | SLOW-START | | | | | | +-------------+ | +------------+ | | | | | |-->| FAST- |---- | | RECOVERY | ---------------->| | +-------------+ Zhang (ed.), et al. [Page 15] draft-ietf-rohc-tcp-00.txt Initially, this algorithm starts in state SLOW-START with ssthresh set to ISSTHRESH and cwnd set to IW. Upon receiving a segment, if it is the first segment, which is not necessary to be the SYN segment, the algorithm sets the current maximum Sequence Number (CMAXSN) and the current minimum Sequence Number (CMINSN) to this segment's sequence number; otherwise, the algorithm takes a procedure according to the current state. - SLOW-START * If the new Sequence Number (NSN) is larger than CMAXSN, increase cwnd by the distance between NSN and CMAXSN, and update CMAXSN and CMINSN based on the following rules: CMAXSN = NSN if (CMAXSN - CMINSN) > cwnd) CMINSN = cwnd - CMAXSN; If the cwnd is larger than ssthresh, the algorithm transits to CONGESTION-AVOIDANCE state; * If the distance between NSN and CMAXSN is less than or equal to 3*MSS, ignore it; * If the distance is larger than 3*MSS, halve the cwnd and set ssthresh to MAX(cwnd, 2*MSS). After that, the algorithm transits into FAST-RECOVERY state. - CONGESTION-AVOIDANCE * If NSN is larger than CMAXSN, increase cwnd by ((NSN- CMAXSN)*MSS)/cwnd and then update CMAXSN and CMINSN based on the following rules: CMAXSN = NSN if (CMAXSN - CMINSN) > cwnd) CMINSN = cwnd - CMAXSN; * If the distance between NSN and CMAXSN is less than or equal to 3*MSS, ignore it; * If the distance is larger than 3*MSS, halve the cwnd and set ssthresh to MAX(cwnd, 2*MSS). After that, the algorithm transits into FAST-RECOVERY state. - FAST-RECOVERY * If NSN is larger than or equal to CMAXSN + cwnd, the algorithm transits into CONGESTION-AVOIDANCE state; * Otherwise, ignore it. In this algorithm, MSS is denoted as the estimated maximum segment size. The implementation can use the MTU of the link as an approximation of this value. ISSHRESH and IW are the initial values Zhang (ed.), et al. [Page 16] draft-ietf-rohc-tcp-00.txt of ssthresh and cwnd, respectively. ISSTHRESH MAY be arbitrarily high. IW SHOULD be set to 4*MSS. 5.1.3. Congestion window tracking based on Acknowledgment Number +-------------+ | | ---------------->| CONGESTION- | | | AVOIDANCE | | ----| |<--- +------------+ | +-------------+ | | | | | | SLOW-START | | | | | | +-------------+ | +------------+ | | | | | |-->| FAST- |---- | | RECOVERY | ---------------->| | +-------------+ This algorithm (Algorithm ACK) maintains 3 states: SLOW-START, CONGESTION-AVOIDANCE and FAST-RECOVERY, which are equivalent to the states in TCP congestion control algorithms. It also maintains 2 variables: cwnd and ssthresh. Initially, this algorithm starts in state SLOW-START with ssthresh set to ISSTHRESH and cwnd set to IW. Upon receiving a segment, if it is the first segment, which is not necessary to be the SYN segment, the algorithm sets the current maximum Acknowledgment Number (CMAXACK) to this segment's acknowledgment number; otherwise, the algorithm takes a procedure according to the current state. - SLOW-START * If the new Acknowledgment Number (NEWACK) is larger than CMAXACK, increase cwnd by the distance between NEWACK and CMAXACK, set duplicate ack counter (NDUPACKS) to 0, and update CMAXACK accordingly; If the cwnd is larger than ssthresh, the algorithm transits to CONGESTION-AVOIDANCE state; * If NEWACK is equal to CMAXACK, increase the NDUPACKS by 1. If NDUPACKS is greater than 3, halve the cwnd and set ssthresh to MAX(cwnd, 2*MSS). Consequently, the algorithm transits into FAST-RECOVERY state; * Otherwise, set NDUPACKS to 0. - CONGESTION-AVOIDANCE Zhang (ed.), et al. [Page 17] draft-ietf-rohc-tcp-00.txt * If NEWACK is larger than CMAXACK, increase cwnd by ((NEWACK- CMAXACK)*MSS)/cwnd, set NDUPACKS to 0 and update CMAXACK accordingly; * If NEWACK is equal to CMAXACK, increase NDUPACKS by 1. If NDUPACKS is greater than 3, halve the cwnd and set ssthresh to MAX(cwnd, 2*MSS). After that, the algorithm transits into FAST-RECOVERY state; * Otherwise, set NDUPACKS to 0. - FAST-RECOVERY * If NEWACK is larger than CMAXACK, set NDUPACKS to 0. Consequently, the algorithm transits into CONGESTION-AVOID state; * Otherwise, ignore it. In this algorithm, MSS is denoted as the estimated maximum segment size. The implementation can use the MTU of the link as an approximation of this value. ISSHRESH and IW are the initial values of ssthresh and cwnd, respectively. ISSTHRESH MAY be arbitrarily high. IW SHOULD be set to 4*MSS. 5.1.4. Further discussion on congestion window tracking In some cases, it is inevitable for the tracking algorithms to overestimate the TCP congestion window. Also, it SHOULD be avoided that the estimated congestion window gets significantly smaller that the actual one. For all of these cases, ROHC-TCP simply applies two boundaries on the estimated congestion window size. One of the two boundaries is the MIN boundary, which is the minimum congestion window size and whose value is determined according to the [INITWIN]; the other boundary is the MAX boundary, which is the maximum congestion window size. There are two possible approaches to setting this MAX boundary. One is to select a commonly used maximum TCP socket buffer size. The other one is to use the simple equation W=sqrt(8/3*l), where W is the maximum window size and l is the typical packet loss rate. If ECN mechanism is deployed, according to [RFC2481] and [ECN], the TCP sender will set the CWR (Congestion Window Reduced) flag in the TCP header of the first new data packet sent after the window reduction, and the TCP receiver will reset the ECN-Echo flag back to 0 after receiving a packet with CWR flag set. Thus, the CWR flag and the ECN-Echo flag's transition from 1 to 0 can be used as another indication of congestion combined with other mechanisms mentioned in the tracking algorithm. 5.2 Operation in unidirectional mode Zhang (ed.), et al. [Page 18] draft-ietf-rohc-tcp-00.txt 5.2.1. Compressor logic In ROHC-TCP, the compressor will start in the IR state and perform different logics in different states. The following sub-sections will describe the logic for each compressor sate in detail. 5.2.1.1. IR state The operations of compressor in IR state can be summarized as follows: a) Upon receiving the first packet, the compressor determines whether the new connection can share the context with other existing one. b) If the new connection can share context with the existing one, the compressor send out PARTIAL-FULL header packet in the step c) instead of the full header packet. c) Upon receiving a packet, the compressor sends IR or IR-DYN packet on the following conditions: 1) if it is the turn to send full header packet according to compression slow-start, i.e. after sending F_PERIOD compressed packets; 2) if the packet to be sent is a retransmission of the packet in context window and it was sent as IR or IR-DYN packet previously. Otherwise, the compressor compresses the packet using windowed LSB encoding. If the compressor enters the IR state for the first time or the static part of the TCP flow has changed, it will send IR packet. Otherwise, it will send IR-DYN packet because the decompressor has known the static part. d) The packet is added into context window as a potential reference after it has been sent out. The compressor then invokes the Algorithm SEQ and Algorithm ACK to track the congestion windows of the two one-way traffics with different directions in a TCP connection. Suppose that the estimated congestion windows are cwnd_seq and cwnd_ack, while the estimated slow start thresholds are ssthresh_seq and ssthresh_ack, respectively. Let W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack) = K*MAX(MAX(cwnd_seq, 2*ssthresh_seq), MAX(cwnd_ack, 2*ssthresh_ack)). If the value of context window, r, is larger than W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack), r can be reduced. K is an implementation parameter that will be further discussed in Section 5.6. e) After sending F_PERIOD compressed packets, F_PERIOD SHOULD be doubled. If it gets larger than W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack), the compressor transits to FO or SO Zhang (ed.), et al. [Page 19] draft-ietf-rohc-tcp-00.txt state. If the compressor finds that the payload size of consecutive packets is a constant value and one of such packets is removed from the context window, which means the decompressor has known the exact value of the constant size, it may transit to SO state. Otherwise it will transit to the FO state. 5.2.1.2. FO state The operations of the compressor in the FO state can be summarized as follows: a) Upon receiving a packet, if it falls behind the context window, i.e. it is older than all the packets in context; the compressor transits to IR state. Otherwise, the compressor compresses it using windowed LSB encoding and sends it. b) The packet is added into context window as a potential reference after it has been sent out. The compressor then invokes the Algorithm SEQ and Algorithm ACK to track the congestion windows of the two one-way traffics with different directions in a TCP connection. Suppose that the estimated congestion windows are cwnd_seq and cwnd_ack, while the estimated slow start thresholds are ssthresh_seq and ssthresh_ack, respectively. Let W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack) = K*MAX(MAX(cwnd_seq, 2*ssthresh_seq), MAX(cwnd_ack, 2*ssthresh_ack)). If the value of context window, r, is larger than W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack), r can be reduced. K is also an implementation parameter, which can be set to the same value as in the IR state. c) If the context window contains only one packet, which means there is a long jump in the packet sequence number or acknowledge number, the compressor will transit to the IR state and re-initialize the algorithm for tracking TCP congestion window. Here, a segment causes a long jump when the distance between its sequence number (or acknowledgment number) and CMAXSN (or CMAXACK) is larger than the estimated congestion window size, i.e., |sequence number (acknowledgement number) - CMAXSN (CMAXACK)| > estimated congestion window size. d) If the compressor finds that the payload size of consecutive packets is a constant value and one of such packets has been removed from the context window, which means the decompressor has known the exact value of the constant size, it may transit to the SO state. Zhang (ed.), et al. [Page 20] draft-ietf-rohc-tcp-00.txt e) If the static context of transfers changed, the compressor will transit to the IR state and re-initialize the algorithms for tracking TCP congestion window. 5.2.1.3. SO state The operations of the compressor in the SO state can be summarized as follows: a) Upon receiving a packet, if it falls behind the context window, i.e. it is older than all the packets in context window; the compressor transits to IR state. Otherwise, the compressor compresses it using fixed-payload encoding and sends it. b) The packet is added into context window as a potential reference after it has been sent out. The compressor then invokes the Algorithm SEQ and Algorithm ACK to track the congestion windows of the two one-way traffics with different directions in a TCP connection. Suppose that the estimated congestion windows are cwnd_seq and cwnd_ack, while the estimated slow start thresholds are ssthresh_seq and ssthresh_ack, respectively. Let W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack) = K*MAX(MAX(cwnd_seq, 2*ssthresh_seq), MAX(cwnd_ack, 2*ssthresh_ack)). If the value of context window, r, is larger than W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack), r can be reduced. K is an implementation parameter, which can be set to the same value as in the IR state. c) If the context window contains only one packet, which means there is a long jump in the packet sequence number or acknowledge number, the compressor will transit to the IR state and re-initialize the algorithms for tracking TCP congestion window. d) If the payload size of the packets in context window doesn't keep constant, the compressor transits to the FO state. e) If the static context of transfers changed, the compressor will transit to the IR state and re-initialize the algorithms for tracking TCP congestion window. 5.2.2. Decompressor logic The logic of the decompressor is simpler compared to the compressor. 5.2.2.1. No Context State Zhang (ed.), et al. [Page 21] draft-ietf-rohc-tcp-00.txt The decompressor starts in this state. Upon receiving an IR or IR- DYN packet, the decompressor should first verify the correctness of this packet. Then it will determine that whether this is a full header packet or PARTIAL-FULL one. For a PARTIAL-FULL header, the decompressor will re-build a new context from the existing one and make the necessary update. Otherwise, the decompressor will just update the context. Finally, the decompressor will use this packet as the reference packet. After that, the decompressor will pass it to the system's network layer and transit to Full Context State. Conformed to ROHC framework [ROHC], only IR or IR-DYN packets may be decompressed in No Context state. 5.2.2.2. Full Context State The operations of decompressor in Full Context state can be summarized as follows: a) Upon receiving an IR or IR-DYN packet, the decompressor should verify the correctness of its header by TCP checksum. If the verification succeeds, the decompressor will update the context and use this packet as the reference packet. Consequently, the decompressor will convert the packet into the original packet and pass it to the network layer of the system. b) Upon receiving the other type of packet, the decompressor will decompress it. After that, the decompressor MUST verify the correctness of the decompressed packet by the TCP checksum. If the verification succeeds, the decompressor passes it to the system's network layer. Then the decompressor will use it as the reference value if this packet is not older than the current reference packet. c) If consequent N packets fail to be decompressed, the decompressor should transit downwards to No Context State. N is an implementation parameter that will be further discussed in Section 5.6. 5.3 Operations in bi-directional mode 5.3.1. Compressor states and logic The bi-directional mode makes use of feedback from decompressor to compressor for OPTIONAL improving the transitions among different states. Feedback packet types ACK and NACK are conform to the ones defined in [ROHC]. Following rules should be combined with the action defined in section 5.2.1. Zhang (ed.), et al. [Page 22] draft-ietf-rohc-tcp-00.txt 5.3.1.1 Master Sequence Number (MSN) for packet acknowledging Feedback of types ACK and NACK carry the information about sequence number/ acknowledgement number from decompressor to the compressor. Unfortunately, sequence number/acknowledgement number field is not guaranteed to be present in every IP protocol stack. It is not visible if the IP payload is encrypted. Meanwhile, the size of the sequence number/acknowledgement number field is rather large, which is not so efficient if it is carried in the feedback packet directly. To overcome this problem ROHC-TCP introduces a control field called the Master Sequence Number (MSN) field. This field is present in every m compressed header and can be used to infer the acknowledged sequence number. The value of m is chosen for the best trade-off between compression efficiency and the acknowledging efficiency. 5.3.1.2 State transition logic In the IR state, the compressor can transit to the FO or SO state once it receives a valid ACK(B) for an IR packet sent (an ACK(B) can only be valid if it refers to a packet sent earlier). If the packet referred by the feedback is in the context window, the compressor will remove the packets older than the referred packet from the context window. Because ACK(B) means that the packet referred by feedback has been the reference of the decompressor, the compressor doesn't need to keep older packets. If the compressor is in the FO or SO state, it will remove the packets older than the referred packet by the feedback from the context window. Upon receiving an NACK(B), the compressor transits back to IR state. 5.3.2. Decompressor states and logic The decompression states and the state transition logic are the same as in the Unidirectional case (see section 5.2.2.). What differs is the feedback logic. Below, rules are defined stating which feedback to use when. When an IR packet passes the verification, send an ACK(B). When an IR-DYN packet or other packet is correctly decompressed, optionally send an ACK(B). In both cases, the feedback packet will carry the master sequence number information about the nearest data packet that had MSN. In the Full Context state, when the verification check of x out of the last y decompressed packets have failed, context damage SHOULD be assumed and a NACK(B) SHOULD be sent. The decompressor moves to Zhang (ed.), et al. [Page 23] draft-ietf-rohc-tcp-00.txt the No Context state and discards all packets until an update which passes the verification check is received. Note that appropriate values for x and y, are related to the residual error rate of the link. When the residual error rate is close to zero, x = y = 1 may be appropriate. In the No Context state, when any packet fails the verification, send an NACK(B). The decompressor discards all packets until a static update (IR) which passes the verification check is received. 5.4. Implementation issues 5.4.1. Determine the value K As mentioned above, the context window SHOULD be shrunk when its size gets larger than K*MAX(MAX(cwnd_seq, 2*ssthresh_seq), MAX(cwnd_ack, 2*ssthresh_ack)). Since the Fast Recovery algorithm was introduced in TCP, several TCP variants had been proposed, which are different only in the behaviors of Fast Recovery. Some of them need several RTTs to be recovered from multiple losses in a window. Ideally, they may send L*W/2 packets in this stage, where L is the number of lost packets and W is the size of the congestion window where error occurs. Some recent work [REQTCP] on improving TCP performance allows transmitting packets even when receiving duplicate acknowledgments. Due to the above concerns, it'd better keep K large enough so as to prevent shrinking context window without enough confidence that corresponding packets had been successfully received. Considering the bandwidth-limited environments and the limited receiver buffer, a practical range of K is around 1~2. From the simulation results, K=1 is good enough for most cases. 5.4.2. Determine the value N We should distinguish out of synchronization from the packet errors cause by the link. So considering the error condition of the link, N should be higher than the packet burst error length, a practical range of N is around 8~10. 5.4.3. Determine the frequency of updating context The choice of the frequency of updating context, ACK(R), is a balance between the efficiency and robustness, i.e. sending ACK(R) more frequently improves the compression robustness but adds more system overhead, and the vice versa. From a practical view, the ACK(R) SHOULD be sent for every 4~8 successfully decompressed packets. Zhang (ed.), et al. [Page 24] draft-ietf-rohc-tcp-00.txt 5.4.4. Possible optimization in U-mode It can be seen that there are two distinct deployments - one where the forward and reverse paths share a link and one where they do not. In the former case it may be the situation that a compressor and decompressor could be co-located as illustrated in Figure 5.4.4. It may then be possible for the compressor and decompressor at each end of the link to exchange information. In such a scenario, ROHC-TCP can make further optimization on context size for windowed LSB encoding. In Figure 5.4.4., C-SN represents the compressor for the sequence number traffic that deployed in Host A, D-SN represents the decompressor for the sequence number traffic that deployed in Host B. Similarly, C-ACK represents the compressor for the acknowledgement number traffic that deployed in Host B, D-ACK represents the decompressor for the acknowledgement number traffic that deployed in Host A. Host A Host B +------------------+ +------------------+ | | | | | +---------+ | SN \ | +---------+ | | | C-SN | | ~ ~ ~ ~ | | D-SN | | | +---------+ | / | +---------+ | | /|\ | | | | | | | | | +---------+ | / | +---------+ | | | D-ACK | | ~ ~ ~ ~ | | C-ACK | | | +---------+ | \ ACK | +---------+ | | | | | +------------------+ +------------------+ Figure 5.4.4. It is known that acknowledgement numbers (from C-ACK to D-ACK) are generally taken from the sequence numbers (from C-SN to D-SN) in the opposite direction. Since an acknowledgement cannot be generated for a packet that has not passed across the link, this offers an efficient way of estimating the TCP congestion window. Denote the current sequence number that is sending out from C-SN as SN-New, denote the sequence number that been acknowledged by the D- ACK as SN-Old, then the TCP congestion window (cwnd-bidir) can be represented as cwnd-bidir = SN-New - SN-Old. Zhang (ed.), et al. [Page 25] draft-ietf-rohc-tcp-00.txt Having this new estimated congestion window, the control parameter W that is calculated in Section 5.2.1. will be re-calculated as W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack) = min ( W(cwnd_seq, ssthresh_seq, cwnd_ack, ssthresh_ack), cwnd-bidir) 5.5. Mode transitions The decision to move from one compression mode to another is taken by the decompressor and the possible mode transitions are shown in the figure below. Subsequent chapters describe how the transitions are performed together with exceptions for the compression and decompression functionality during transitions. +-------------------------+ | Unidirectional (U) mode | +-------------------------+ | ^ | | Feedback(U) | | | | Feedback(B) | | v | +-------------------------+ | Bidirectional (B) mode | +-------------------------+ 5.5.1. Compression and decompression during mode transitions The following sections assume that, for each context, the compressor and decompressor maintain a variable whose value is the current compression mode for that context. The value of the variable controls, for the context in question, which packet types to use, which actions to be taken, etc. As a safeguard against residual errors, all feedback sent during a mode transition MUST be protected by a CRC, i.e., the CRC option MUST be used. A mode transition MUST NOT be initiated by feedback which is not protected by a CRC. The subsequent subsections define exactly when to change the value of the MODE variable. When ROHC transits between compression modes, there are several cases where the behavior of compressor or decompressor must be restricted during the transition phase. These restrictions are defined by exception parameters that specify which restrictions to apply. The transition descriptions in subsequent chapters refer to these exception parameters and defines when they are set and to what values. All mode-related parameters are listed Zhang (ed.), et al. [Page 26] draft-ietf-rohc-tcp-00.txt below together with their possible values, with explanations and restrictions: Parameters for the compressor side: - C_MODE: Possible values for the C_MODE parameter are (U)NIDIRECTIONAL, (B)IDIRECTIONAL. C_MODE MUST be initialized to U. - C_TRANS: Possible values for the C_TRANS parameter are (P)ENDING and (D)ONE. C_TRANS MUST be initialized to D. When C_TRANS is P, it is REQUIRED 1) that the compressor only use packet formats common to all modes, 2) that mode information is included in packets sent, at least periodically, 4) that new mode transition requests be ignored. Parameters for the decompressor side: - D_MODE: Possible values for the D_MODE parameter are (U)NIDIRECTIONAL and (B)IDIRECTIONAL. D_MODE MUST be initialized to U. - D_TRANS: Possible values for the D_TRANS parameter are (I)NITIATED, (P)ENDING and (D)ONE. D_TRANS MUST be initialized to D. A mode transition can be initiated only when D_TRANS is D. While D_TRANS is I, the decompressor sends a NACK or ACK carrying a CRC option for each received packet. 5.5.2. Transition from Unidirectional to Bidirectional mode When there is a feedback channel available, the decompressor may at any moment decide to initiate transition from Unidirectional to Bidirectional mode. Any feedback packet carrying a CRC can be used with the mode parameter set to O. The decompressor can then directly start working in Optimistic mode. The compressor transits from Unidirectional to Bidirectional mode as soon as it receives any feedback packet that has the mode parameter set to B and that passes the CRC check. The transition procedure is described below: Compressor Decompressor ---------------------------------------------- | | | ACK(B)/NACK(B) +-<-<-<-| D_MODE = B Zhang (ed.), et al. [Page 27] draft-ietf-rohc-tcp-00.txt | +-<-<-<-<-<-<-<-+ | C_MODE = B |-<-<-<-+ | | | If the feedback packet is lost, the compressor will continue to work in Unidirectional mode, but as soon as any feedback packet reaches the compressor it will transit to Bidirectional mode. 5.5.3. Transition to Unidirectional mode The decompressor can force a transition back to Unidirectional mode if it desires to do so. A three-way handshake MUST be carried out to ensure correct transition on the compressor side. The transition procedure is described below: Compressor Decompressor ---------------------------------------------- | | | ACK(U)/NACK(U) +-<-<-<-| D_TRANS = I | +-<-<-<-<-<-<-<-+ | C_TRANS = P |-<-<-<-+ | C_MODE = U | | |->->->-+ IR/IR-DYN | | +->->->->->->->-+ | |->-.. +->->->-| |->-.. | | ACK(SN,U) +-<-<-<-| | +-<-<-<-<-<-<-<-+ | C_TRANS = D |-<-<-<-+ | | | |->->->-+ U-mode packet | | +->->->->->->->-+ | | +->->->-| D_TRANS = D, D_MODE= U After ACKing the IR-DYN(U), or IR(U), the decompressor MUST continue to send feedback with the Mode parameter set to U until it receives a U-mode packet. 6. Coding Scheme and compressed packet header format Following the requirement of TCP/IP header compression [REQTCP], ROHC-TCP should fit into the ROHC framework. Thus, ROHC-TCP will conform to the general format and the reserved packet types defined in [ROHC]. In this document, ROHC-TCP adopts EPIC-LITE as the coding framework. The detail of EPIC-LITE scheme had been discussed in [EPIC]. EPIC- LITE is used to generate new ROHC profiles. This scheme takes as its input a list of fields in the protocol stack to be compressed, Zhang (ed.), et al. [Page 28] draft-ietf-rohc-tcp-00.txt and for each field a choice of one or more compression techniques. Using this input EPIC-LITE derives a set of compressed header formats that can be used to quickly and efficiently compress and decompress headers. A TCP/IP profile is proposed to describe the behaviors of each field in TCP/IP header. 6.1. Windowed LSB encoding and fixed-payload encoding As stated above, the change patterns of several TCP fields (for example, Sequence Number, Acknowledgement Number, Window, etc.) are completely different from the ones of RTP, and are very hard to predict. Thus, Windowed LSB encoding, which does not assume the linear changing pattern of the target header fields, is used in ROHC-TCP to encode those TCP fields both efficiently and robustly. The Windowed LSB encoding will be applied to several fields, such as IP-ID, Sequence Number, Acknowledgment Number, Window fields, TCP Timestamp option, etc. For some applications, such as bulk data transferring, etc., the payload size of each packet is usually a constant value, e.g. 1460 bytes. In such a case, the sequence number and acknowledgment number can be represented as the following equation: SEQ (or ACK) = m * PAYLOAD + n. If all the packets in context window have the same 'n', only 'm' need be transmitted to the decompressor. The decompressor can assign the value of PAYLOAD by the packet size of the reference packet. Then, the decompressor can obtain the sequence number or acknowledgment number after correctly decoding 'm', and use them as the reference values. This encoding method is called fixed-payload encoding. 6.2. The framework of EPIC-LITE scheme The detailed information about EPIC-LITE, include the structure of the EPIC-LITE compressed headers, the overview of the input language for EPIC-LITE, the packet types available to EPIC-LITE, the library of EPIC-LITE encoding methods, and how to create a new ROHC profile, are described in [EPIC]. 6.3. ROHC Profile for compression of TCP/IP This session describes a ROHC profile for the compression of TCP/IP. < need to be further refine> Zhang (ed.), et al. [Page 29] draft-ietf-rohc-tcp-00.txt Note that the probabilities listed for each encoding method are initial estimates only. These need to be refined with more accurate values from genuine TCP/IP streams. The profile for TCP/IP compression is given below: only uses the following toolbox methods: - STATIC-KNOWN - STATIC-UNKNOWN - STATIC - IRREGULAR - LSB - VALUE - C profile_identifier 0xFFFF max_formats 60 max_sets 48 bit_alignment 8 npatterns 224 CO_packet TCP-IP-CO IR_packet TCP-IP-IR IR-DYN_packet TCP-IP-DYN TCP-IP-CO = INFERRED-IP-CHECKSUM(IPv4-co-header) TCP-co-header skip-msn CRC(3,80%) | CRC(7,20%) ; ; since we want to have a MSN in some packets and not in others, ; there needs to be some way to indicate that there is a ; context value present. ; ; we need to agree on the degree of CRC protection that is ; appropriate for the various packets ; TCP-IP-IR = INFERRED-IP-CHECKSUM(IPv4-ir-header) TCP-ir-header msn-ir CRC(8,100%) TCP-IP-DYN = INFERRED-IP-CHECKSUM(IPv4-dyn-header) TCP-dyn-header msn-dyn CRC(8,100%) IPv4-co-header = version header_len tos-co Zhang (ed.), et al. [Page 30] draft-ietf-rohc-tcp-00.txt ecn length ip-id-co rf_flag df_flag-co mf_flag offset ttl-co protocol ip_chksum src_address-co dst_address-co IPv4-ir-header = version header_len tos-dyn ecn length ip-id-dyn rf_flag df_flag-dyn mf_flag offset ttl-dyn protocol ip_chksum src_address-ir dst_address-ir IPv4-dyn-header = version header_len tos-dyn ecn length ip-id-dyn rf_flag df_flag-dyn mf_flag offset ttl-dyn protocol ip_chksum src_address-co dst_address-co version = VALUE(4,4,100%) header_len = VALUE(4,5,100%) tos-co = STATIC(99%) | IRREGULAR(6,1%) tos-dyn = IRREGULAR(6,100%) Zhang (ed.), et al. [Page 31] draft-ietf-rohc-tcp-00.txt ecn = STACK-TO-CONTROL(2) length = INFERRED-SIZE(16,128) ip-id-co = NBO(16) ; check byte-order FORMAT(ip-id-seq-co, ip-id-rnd) STATIC(100%) ; nbo flag ip-id-dyn = NBO(16) ; check byte-order FORMAT(ip-id-seq-dyn, ip-id-rnd) IRREGULAR(16,100%) IRREGULAR(1,100%) ; nbo flag ip-id-seq-co = LSB(4,3,70%) | LSB(6,8,15%) | LSB(8,8,15%) | IRREGULAR(16,30%) ip-id-rnd = IRREGULAR(16,100%) ip-id-seq-dyn = IRREGULAR(16,100%) rf_flag = STACK-TO-CONTROL(1) df_flag-co = STATIC(80%) | IRREGULAR(20%) df-flag-dyn = IRREGULAR(1,100%) mf_flag = VALUE(1,0,100%) offset = VALUE(13,0,100%) ttl-co = STATIC(99%) | IRREGULAR(8,1%) ttl-dyn = IRREGULAR(8,100%) protocol = VALUE(8,6,100%) ; need to take account of extension ; headers at some point ; ip_chksum = VALUE(16,0,100%) src_address-co = STATIC(100%) src_address-ir = IRREGULAR(32,100%) dst_address-co = STATIC(100%) dst_address-ir = IRREGULAR(32,100%) Zhang (ed.), et al. [Page 32] draft-ietf-rohc-tcp-00.txt TCP-header-co = source_port-co dest_port-co seqno ackno data_offset flags-co window-co tcp_chksum urg_ptr-co TCP-header-dyn = source_port-co dest_port-co seqno ackno data_offset flags-dyn window-dyn tcp_chksum urg_ptr-dyn TCP-header-ir = source_port-ir dest_port-ir seqno ackno data_offset flags-dyn window-dyn tcp_chksum urg_ptr-dyn source_port-co = STATIC(100%) source_port-ir = IRREGULAR(16,100%) dest_port-co = STATIC(100%) dest_port-ir = IRREGULAR(16,100%) seqno = STACK-TO-CONTROL(32) ackno = STACK-TO-CONTROL(32) seqno-co = LSB(8,63,5%) | LSB(14,4096,80%) | LSB(20,16384,10%) | IRREGULAR(32,5%) seqno-dyn = IRREGULAR(32,100%) ackno-co = LSB(8,0,10%) | LSB(14,0,80%) | LSB(20,0,5%) | IRREGULAR(32,5%) ackno-dyn = IRREGULAR(32,100%) data_offset = STACK-TO-CONTTROL(4) Zhang (ed.), et al. [Page 33] draft-ietf-rohc-tcp-00.txt window-co = STATIC(80%) | LSB(12,63,10%) | IRREGULAR(16,10%) window-dyn = IRREGULAR(16,100%) tcp_chksum = IRREGULAR(16,100%) urg-ptr = STACK-TO-CONTROL(16) urg_ptr-co = STATIC(99%) | IRREGULAR(16,1%) urg_ptr-dyn = IRREGULAR(16,100%) flags-co = reserved-co cwr ece urg ack psh rst-syn-fin-co flags-dyn = reserved-dyn IRREGULAR(2,100%) urg IRREGULAR(1,100%) psh-dyn rst-syn-fin-dyn get-rf = ROTATE(4,1) STACK-FROM-CONTROL(1) reserved-co = get-rf FORMAT(reserved-unused, reserved-used) STATIC(100%) ; format selector reserved-dyn = get-rf FORMAT(reserved-unused, reserved-used) IRREGULAR(1,100%) ; format selector reserved-unused = VALUE(5,0,100%) reserved-used = reserved-flag reserved-flag reserved-flag reserved-flag reserved-flag reserved-flag = IRREGULAR(1,100%) cwr-ece = STACK-TO-CONTROL(2) Zhang (ed.), et al. [Page 34] draft-ietf-rohc-tcp-00.txt cwr = IRREGULAR(1,100%) ece = IRREGULAR(1,100%) urg = STACK-TO-CONTROL(1) ack-co = VALUE(1,1,99.9%) | VALUE(1,0,0.1%) ack-dyn = IRREGULAR(1,100%) psh-co = FORMAT(reg-psh-co, irreg-psh) STATIC(100%) ; format selector psh-dyn = FORMAT(reg-psh-dyn, irreg-psh) IRREGULAR(1,100%) ; format selector reg-psh-co = STATIC(90%) | N(IRREGULAR(1,9%) | IRREGULAR(1,9%) reg-psh-dyn = IRREGULAR(1,100%) irreg-psh = IRREGULAR(1,100%) rst-syn-fin-co = no-flag(98%) | rst-only(1%) | fin-only(1%) no-flag = VALUE(3,0x0,100%) rst-only = VALUE(3,0x4,100%) syn-only = VALUE(3,0x2,100%) fin-only = VALUE(3,0x1,100%) rst-syn-fin-dyn = IRREGULAR(3,100%) tcp-options-co = ROTATE(3,1) ; get TCP data offset LIST(4,1,32,-160,8, U(OPTIONAL(tcp-sack-co)), U(OPTIONAL(tcp-timestamp-co)), U(OPTIONAL(tcp-mss)), U(OPTIONAL(tcp-end)), U(OPTIONAL(tcp-wscale)), U(OPTIONAL(sack-permitted)), U(OPTIONAL(tcp-generic-co)), U(OPTIONAL(tcp-generic-co)), 5,8,2,0,3,4) STATIC(100%) ; option order STATIC(95%) | IRREGULAR(8,5%) ; option presence tcp-options-dyn = ROTATE(3,1) ; get TCP data offset Zhang (ed.), et al. [Page 35] draft-ietf-rohc-tcp-00.txt LIST(4,1,32,-160,8, U(OPTIONAL(tcp-sack-dyn)), U(OPTIONAL(tcp-timestamp-dyn)), U(OPTIONAL(tcp-mss)), U(OPTIONAL(tcp-end)), U(OPTIONAL(tcp-wscale)), U(OPTIONAL(sack-permitted)), U(OPTIONAL(tcp-generic-dyn)), U(OPTIONAL(tcp-generic-dyn)), 5,8,2,0,3,4) IRREGULAR(24,100%) ; option order IRREGULAR(8,100%) ; option presence ; ; need further discussion ; tcp-sack-co = VALUE(8,5,100%) ; type STACK-TO-CONTROL(8) ; length LIST(8,1,8,-16,0, OPTIONAL(sack-block-co), OPTIONAL(sack-block-co), OPTIONAL(sack-block-co), OPTIONAL(sack-block-co)) STATIC(90%) | IRREGULAR(8,10%) ; order sack-block-presence sack-block-presence = VALUE(1,1,100%) VALUE(1,1,50%) | VALUE(1,0,50%) VALUE(1,1,20%) | VALUE(1,0,80%) VALUE(1,1,5%) | VALUE(1,0,95%) tcp-sack-dyn = VALUE(8,5,100%) ; type STACK-TO-CONTROL(8) ; length LIST(8,1,8,-16,0, OPTIONAL(sack-block-dyn), OPTIONAL(sack-block-dyn), OPTIONAL(sack-block-dyn), OPTIONAL(sack-block-dyn)) IRREGULAR(8,10%) ; order Zhang (ed.), et al. [Page 36] draft-ietf-rohc-tcp-00.txt sack-block-presence-dyn sack-block-presence-dyn = IRREGULAR(1,100%) IRREGULAR(1,100%) IRREGULAR(1,100%) IRREGULAR(1,100%) sack-block-dyn = sack-element-dyn sack-element-dyn sack-block-co = sack-element-co sack-element-co sack-element-dyn = INFERRED-OFFSET-LIST(32) ; offset from base STACK-TO-CONTROL(32) ; preserve new base IRREGULAR(32,100%) sack-element = INFERRED-OFFSET-LIST(32) ; offset from base STACK-TO-CONTROL(32) ; preserve new base STATIC(50%) | LSB(16,32768,30%) | LSB(24,1048576,20%) tcp-timestamp-co = VALUE(8,8,100%) ; type VALUE(8,10,100%) ; length ts-entry ts-entry ts-entry-co = LSB(12,0,60%) | LSB(16,0,30%) | IRREGULAR(32,10%) ts-entry-dyn = IRREGULAR(32,100%) tcp-mss = VALUE(8,2,100%) ; type VALUE(8,4,100%) ; length IRREGULAR-PADDED(16,11,99%) | IRREGULAR(16,1%) tcp-end = VALUE(8,0,100%) ; type tcp-wscale = VALUE(8,3,100%) ; type VALUE(8,3,100%) ; length IRREGULAR-PADDED(8,4,100%) ; scale tcp-sack-permitted = VALUE(8,4,100%) ; type Zhang (ed.), et al. [Page 37] draft-ietf-rohc-tcp-00.txt VALUE(8,2,100%) ; length tcp-generic-co = STATIC(100%) ; type STACK-TO-CONTROL(8) ; length UNCOMPRESSED(8,1,8,-16) ; value tcp-generic-dyn = IRREGULAR(8,100%) ; type STACK-TO-CONTROL(8) ; length UNCOMPRESSED(8,1,8,-16) ; value get-seq-ack = ROTATE(2,1) STACK-FROM-CONTROL(2) ; cwr/ece ROTATE(4,1) STACK-FROM-CONTROL(2) ; ecn STACK-FROM-CONTROL(32) ; ack STACK-FROM-CONTROL(32) ; seq seqno-and-ackno-co = FORMAT(bulk-data-co, bulk-ack-co, interactive- co) STATIC(100%) ; format selector seqno-and-ackno-dyn = FORMAT(bulk-data-dyn, bulk-ack-dyn, interactive-dyn) IRREGULAR(2,100%) ; format-selector bulk-data-co = data-seqno-co data-ackno-co ecn-co bulk-ack-co = ack-seqno-co ack-ackno-co ecn-co interactive-co = interact-seqno-co interact-ackno-co ecn-co bulk-data-dyn = seqno-dyn ackno-dyn ecn-dyn bulk-ack-dyn = seqno-dyn ackno-dyn ecn-dyn Zhang (ed.), et al. [Page 38] draft-ietf-rohc-tcp-00.txt interactive-dyn = seqno-dyn ackno-dyn ecn-dyn ; ; To be refined. ; data-seqno-co = LSB(14,0,50%) | LSB(16,32768,30%) | LSB(20,65536,20%) data-ackno-co = STATIC(50%) | LSB(10,0,30%) | LSB(16,0,20%) ecn-co = FORMAT(no-ecn-co, use-ecn-co) no-ecn-co = VALUE(2,0,100%) VALUE(2,0,100%) use-ecn-co = IRREGULAR(4,100%) seqno-dyn = IRREGULAR(32,100%) ackno-dyn = IRREGULAR(32,100%) ecn-dyn = FORMAT(no-ecn-dyn, use-ecn-dyn) IRREGULAR(1,100%) ; format selector no-ecn-dyn = VALUE(2,0,100%) VALUE(2,0,100%) use-ecn-dyn = IRREGULAR(2,100%) IRREGULAR(2,100%) ack-seqno-co = STATIC(50%) | LSB(10,0,30%) | LSB(16,0,20%) ack-ackno-co = LSB(14,0,50%) | LSB(16,0,30%) | LSB(20,0,20%) interact-seqno-co = LSB(10,256,35%) | LSB(14,2048,50%) | LSB(18,4096,15%) interact-ackno-co = LSB(10,0,35%) | LSB(14,0,50%) | LSB(18,0,15%) msn-ir = MSN-IRREGULAR(16,10%) msn-dyn = MSN-LSB(3,0,90%) | MSN-LSB(7,0,9%) | MSN- IRREGULAR(16,1%) Zhang (ed.), et al. [Page 39] draft-ietf-rohc-tcp-00.txt 7. Security considerations ROHC-TCP is conformed to ROHC framework. Consequently the security considerations for ROHC-TCP match those of [ROHC]. 8. Acknowledgements Header compression schemes from [VJHC, IPHC, ROHC] have been important sources of ideas and knowledge. This document also benefited from discussion on the rohc mailing list about some key issues. 9. References [RFC2026] S. Bradner, "The Internet Standards Process -- Revision 3", BCP 9, RFC 2026, October 1996. [VJHC] V. Jacobson, "Compressing TCP/IP headers for low-speed serial links", RFC 1144, February 1990. [IPHC] M. Degermark, B. Nordgren, and S. Pink, "IP Header Compression", RFC 2507, February 1999. [RFC2018] M. Mathis, J. Mahdavi, S. Floyd, and A. Romanow, "TCP Selective Acknowledgment Options", RFC 2018, October 1996. [RFC2883] S. Floyd, J. Mahdavi, M. Mathis, and M. Podolsky, "An Extension to the Selective Acknowledgement (SACK) Option for TCP", RFC 2883, July 2000. [RFC1323] V. Jacobson, R. Braden, and D. Borman, "TCP Extensions for High Performance", RFC 1323, May 1992. [RFC2119]7 S. Bradner, "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [E2E] V. Jacobson, "Fast Retransmit", Message to the end2end- interest mailing list, April 1990. [Mobi96] M. Degermark, M. Engan, B. Nordgren, and Stephen Pink, "Low-loss TCP/IP header compression for wireless networks", In the Proceedings of MobiCom, 1996. [RFC3095] Bormann (ed.), et al., "RObust Header Compression (ROHC)", RFC 3095, July 2001. [CAC] V. Jacobson, "Congestion avoidance and control", In ACM SIGCOMM '88, 1988. Zhang (ed.), et al. [Page 40] draft-ietf-rohc-tcp-00.txt [RFC2581] M. Allman, V. Paxson, and W. R. Stevens, "TCP Congestion Control", RFC 2581, April 1999. [RFC2481] K. Ramakrishnan, S. Floyd, "A Proposal to add Explicit Congestion Notification (ECN) to IP", RFC 2481, January 1999. [ECN] K. K. RamaKrishnan, Sally Floyd, D. Black, "The Addition of Explicit Congestion Notification (ECN) to IP", Internet Draft (work in progress), June, 2001. [REQTCP] L-E. Jonsson, "Requirements for ROHC IP/TCP header compression", Internet Draft (work in progress), June 20, 2001. [LTX] M. Allman, H. Balakrishnan, and S. Floyd, "Enhancing TCP's Loss Recovery Using Limited Transmit", Internet Draft (work in progress), August 2000. [RFC3096] M. Degermark, "Requirements for robust IP/UDP/RTP header compression", RFC 3096, July 2001. [INITWIN] M. Allman, S. Floyd, and C. Partridge, "Increasing TCP's Initial Window", Internet Draft (work in progress), May 2001. [EPIC] Richard Price et al, "Framework for EPIC-LITE", , Internet Draft (work in progress), Oct. 2001. [RFC791] Postel, J., "Internet Protocol", STD 5, September 1981. [RFC793] Postel, J., "Transmission Control Protocol", STD 7, DARPA, September 1981. [RFC1072] Jacobson, V., and R. Braden, "TCP Extensions for Long- Delay Paths", LBL, ISI, October 1988. [RFC1146] Zweig, J., and C. Partridge, "TCP Alternate Checksum Options", UIUC, BBN, March 1990. [RFC1323] Jacobson, V., Braden, R., and D. Borman, "TCP Extensions for High Performance", LBL, ISI, Cray Research, May 1992. [RFC1644] Braden, R. "T/TCP -- TCP Extensions for Transactions Functional Specification", ISI, July 1994. [RFC1693] Connolly, T., et al, "An Extension to TCP : Partial Order Service", University of Delaware, November 1994. [RFC2001] Stevens, W., TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms, NOAO, January 1997 [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and Romanow, A., TCP Selective Acknowledgement Options, April 1996. Zhang (ed.), et al. [Page 41] draft-ietf-rohc-tcp-00.txt [RFC2026] Bradner, S., "The Internet Standards Process - Revision 3", October 1996 [RFC2385] Heffernan, A., "Protection of BGP Sessions via the TCP MD5 Signature Option", Cisco Systems, August 1998. [RFC2474] Nichols, K., et al Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers, December 1998 [RFC2481] Ramakrishnan, K., Floyd, S., Proposal to add Explicit Congestion Notification (ECN) to IP, AT&T Labs Research, LBNL, January 1999 [RFC 2508] Casner, S., Jacobson, V., Compressing IP/UDP/RTP Headers for Low-Speed Serial Links, Cisco Systems, February 1999 [RFC2509] Engan, M., et al, IP Header Compression over PPP, February 1999 [RFC2581] Allman, M., et al, TCP Congestion Control, April 1999 [RFC2883] Floyd, S., et al, An Extension to the Selective Acknowledgement (SACK) Option for TCP, July 2000 [ECN-X] Spring, N., Wetherall, D., Ely, D., Robust ECN Signaling with Nonces, draft-ietf-tsvwg-tcp-nonce-02.txt, University of Washington, October 2001. [IANA] http://www.iana.org/assignments/tcp-parameters 10. Authors' addresses Qian Zhang Tel: +86 10 62617711-3135 Email: qianz@microsoft.com HongBin Liao Tel: +86 10 62617711-3156 Email: i-hbliao@microsoft.com Ya-Qin Zhang Tel: +86 10 62617711 Email: yzhang@microsoft.com Wenwu Zhu Tel: +86 10 62617711-5405 Email: wwzhu@microsoft.com Microsoft Research Asia Beijing Sigma Center No.49, Zhichun Road, Haidian District Beijing 100080, P.R.C. Robert Hancock Tel: +44 1794 833601 Zhang (ed.), et al. [Page 42] draft-ietf-rohc-tcp-00.txt Email: robert.hancock@roke.co.uk Stephen McCann Tel: +44 1794 833341 Email: stephen.mccann@roke.co.uk Paul Ollis Tel: +44 1794 833168 Email: paul.ollis@roke.co.uk Richard Price Tel: +44 1794 833681 Email: richard.price@roke.co.uk Abigail Surtees Tel: +44 1794 833131 Email: abigail.surtees@roke.co.uk Mark A West Tel: +44 1794 833311 Email: mark.a.west@roke.co.uk Roke Manor Research Ltd Romsey, Hants, SO51 0ZN United Kingdom Zhang (ed.), et al. [Page 43] draft-ietf-rohc-tcp-00.txt Appendix A - Detailed classification of header fields Header compression is possible thanks to the fact that most header fields do not vary randomly from packet to packet. Many of the fields exhibit static behavior or change in a more or less predictable way. When designing a header compression scheme, it is of fundamental importance to understand the behavior of the fields in detail. Since the IP header does exhibit some slightly different behavior from that previously presented in [ROHC] for the RTP case, it is also included in this document. It is intentional that much of the classification text from [ROHC] has been borrowed. This is for easier reading rather than inserting many references to that document. Again based on the format presented in [ROHC] TCP/IP header fields are classified and analyzed in two steps. First, we have a general classification in Section 3, where the fields are classified on the basis of stable knowledge and assumptions. The general classification does not take into account the change characteristics of changing fields because those will vary more or less depending on the implementation and on the application used. A less stable but more detailed analysis of the change characteristics is then done in Section A.4. Finally, Section A.5 summarizes this appendix with conclusions about how the various header fields should be handled by the header compression scheme to optimize compression and functionality. The general requirement for transparency is also seen to be more interesting. A number of recent proposals for extensions to TCP make use of some of the previously Reserved bits. It is therefore clear that a Reserved bit cannot be taken to have a guaranteed zero value, but may change. Ideally, this should be accommodated by the compression profile. A.1. General classification Definitions (and some text) copied from [ROHC] Appendix A. Differences between IP field behavior between [ROHC] (i.e. IP/UDP/RTP behavior for audio and video applications) and this document have been identified. At a general level, the header fields are separated into 5 classes: INFERRED These fields contain values that can be inferred from other values, for example the size of the frame carrying the packet, and thus do not have to be handled at all by the compression scheme. STATIC These fields are expected to be constant throughout the Zhang (ed.), et al. [Page 44] draft-ietf-rohc-tcp-00.txt lifetime of the packet stream. Static information must in some way be communicated once. STATIC-DEF STATIC fields whose values define a packet stream. They are in general handled as STATIC. STATIC-KNOWN These STATIC fields are expected to have well-known values and therefore do not need to be communicated at all. CHANGING These fields are expected to vary in some way: randomly, within a limited value set or range, or in some other manner. In this section, each of the IP and TCP header fields is assigned to one of these classes. For all fields except those classified as CHANGING, the motives for the classification are also stated. In section 4, CHANGING fields are further examined and classified on the basis of their expected change behavior. A.1.1. IP header fields A.1.1.1. IPv6 header fields +---------------------+-------------+----------------+ | Field | Size (bits) | Class | +---------------------+-------------+----------------+ | Version | 4 | STATIC | | Traffic Class* | 6 | CHANGING | | ECT flag* | 1 | CHANGING | | ECE flag* | 1 | CHANGING | | Flow Label | 20 | STATIC-DEF | | Payload Length | 16 | INFERRED | | Next Header | 8 | STATIC | | Hop Limit | 8 | CHANGING | | Source Address | 128 | STATIC-DEF | | Destination Address | 128 | STATIC-DEF | +---------------------+-------------+----------------+ * differs from [ROHC] Version The version field states which IP version is used. Packets with different values in this field must be handled by different IP stacks. All packets of a packet stream must therefore be of the same IP version. Accordingly, the field is classified as STATIC. Flow Label This field may be used to identify packets belonging to a specific packet stream. If not used, the value should be set to Zhang (ed.), et al. [Page 45] draft-ietf-rohc-tcp-00.txt zero. Otherwise, all packets belonging to the same stream must have the same value in this field, it being one of the fields that define the stream. The field is therefore classified as STATIC-DEF. Payload Length Information about packet length (and, consequently, payload length) is expected to be provided by the link layer. The field is therefore classified as INFERRED. Next Header This field will usually have the same value in all packets of a packet stream. It encodes the type of the subsequent header. Only when extension headers are sometimes present and sometimes not, will the field change its value during the lifetime of the stream. The field is therefore classified as STATIC. Source and Destination addresses These fields are part of the definition of a stream and must thus be constant for all packets in the stream. The fields are therefore classified as STATIC-DEF. Total size of the fields in each class: +--------------+--------------+ | Class | Size (octets)| +--------------+--------------+ | INFERRED | 2 | | STATIC | 1.5 | | STATIC-DEF | 34.5 | | CHANGING | 2 | +--------------+--------------+ A.1.1.2. IPv4 header fields +---------------------+-------------+----------------+ | Field | Size (bits) | Class | +---------------------+-------------+----------------+ | Version | 4 | STATIC | | Header Length | 4 | STATIC-KNOWN | | Type of Service* | 6 | CHANGING | | ECT flag* | 1 | CHANGING | | ECE flag* | 1 | CHANGING | | Packet Length | 16 | INFERRED | | Identification | 16 | CHANGING | | Reserved flag* | 1 | CHANGING | | Don't Fragment flag*| 1 | CHANGING | | More Fragments flag | 1 | STATIC-KNOWN | | Fragment Offset | 13 | STATIC-KNOWN | | Time To Live | 8 | CHANGING | | Protocol | 8 | STATIC | Zhang (ed.), et al. [Page 46] draft-ietf-rohc-tcp-00.txt | Header Checksum | 16 | INFERRED | | Source Address | 32 | STATIC-DEF | | Destination Address | 32 | STATIC-DEF | +---------------------+-------------+----------------+ * differs from [ROHC] Version The version field states which IP version is used. Packets with different values in this field must be handled by different IP stacks. All packets of a packet stream must therefore be of the same IP version. Accordingly, the field is classified as STATIC. Header Length As long no options are present in the IP header, the header length is constant and well known. If there are options, the fields would be STATIC, but it is assumed here that there are no options. The field is therefore classified as STATIC-KNOWN. Packet Length Information about packet length is expected to be provided by the link layer. The field is therefore classified as INFERRED. Flags The Reserved flag must be set to zero, as defined in [RFC791]. In [ROHC] the field is therefore classified as STATIC-KNOWN. However, it is expected that reserved fields may be used at some future point. It appears unwise to select an encoding that would preclude the use of a compression profile for a future change in the use of reserved fields. For this reason the alternative encoding of CHANGING is suggested. It would also be possible to have more than one compression profile, in one of which this field was considered to be STATIC-KNOWN. The More Fragments (MF) flag is expected to be zero because fragmentation is generally not expected. As discussed in the RTP case, only the first fragment will contain the transport layer protocol header; subsequent fragments would have to be compressed with a different profile. In terms of the effect of header overhead, if fragmentation does occur then the first fragment, by definition, should be relatively large, minimizing the header overhead. In the case of TCP, fragmentation should not be common due to a combination of initial MSS negotiation and subsequent use of path-MTU discovery. The More Fragments flag is therefore classified as STATIC-KNOWN. However, a profile could accept that this flag may be set in order to cope with fragmentation. Fragment Offset Zhang (ed.), et al. [Page 47] draft-ietf-rohc-tcp-00.txt Under the assumption that no fragmentation occurs, the fragment offset is always zero. The field is therefore classified as STATIC- KNOWN. Even if fragmentation were to be further considered, then only the first fragment would contain the TCP header and would still be zero. Protocol This field will usually have the same value in all packets of a packet stream. It encodes the type of the subsequent header. Only when extension headers are sometimes present and sometimes not, will the field change its value during the lifetime of a stream. The field is therefore classified as STATIC. Header Checksum The header checksum protects individual hops from processing a corrupted header. When almost all IP header information is compressed away, there is no point in having this additional checksum; instead it can be regenerated at the decompressor side. The field is therefore classified as INFERRED. Source and Destination addresses These fields are part of the definition of a stream and must thus be constant for all packets in the stream. The fields are therefore classified as STATIC-DEF. Total size of the fields in each class: +--------------+----------------+ | Class | Size (octets) | +--------------+----------------+ | INFERRED | 4 | | STATIC* | 1 + 4 bits | | STATIC-DEF | 8 | | STATIC-KNOWN*| 2 + 2 bits | | CHANGING* | 4 + 2 bits | +--------------+----------------+ * differs from [ROHC] A.1.2. TCP header fields +---------------------+-------------+----------------+ | Field | Size (bits) | Class | +---------------------+-------------+----------------+ | Source Port | 16 | STATIC-DEF | | Destination Port | 16 | STATIC-DEF | | Sequence Number | 32 | CHANGING | | Acknowledgement Num | 32 | CHANGING | | Data Offset | 4 | INFERRED | Zhang (ed.), et al. [Page 48] draft-ietf-rohc-tcp-00.txt | Reserved | 4 | CHANGING | | ECN flags | 2 | CHANGING | | CWR flag | 1 | CHANGING | | ECE flag | 1 | CHANGING | | URG flag | 1 | CHANGING | | ACK flag | 1 | CHANGING | | PSH flag | 1 | CHANGING | | RST flag | 1 | CHANGING | | SYN flag | 1 | CHANGING | | FIN flag | 1 | CHANGING | | Window | 16 | CHANGING | | Checksum | 16 | CHANGING | | Urgent Pointer | 16 | CHANGING | | Options | 0(-352) | CHANGING | +---------------------+-------------+----------------+ Source and Destination ports These fields are part of the definition of a stream and must thus be constant for all packets in the stream. The fields are therefore classified as STATIC-DEF. Data Offset The number of 4 octet words in the TCP header, thus indicating The start of the data. It is always a multiple of 4 octets. It can be re-constructed from the length of any options and is not necessary. The field is therefore classified as INFERRED. A.1.3. Summary for IP/TCP Summarizing this for IP/TCP one obtains +----------------+----------------+----------------+ | Class \ IP ver | IPv6 (octets) | IPv4 (octets) | +----------------+----------------+----------------+ | INFERRED | 2 + 4 bits | 4 + 4 bits | | STATIC | 1 + 4 bits | 1 + 4 bits | | STATIC-DEF | 38 + 4 bits | 12 | | STATIC-KNOWN | - | 2 + 2 bits | | CHANGING | 17 + 6 bits | 17 | | |(- 61 + 6 bits) | (- 61) | +----------------+----------------+----------------+ | Totals | 60 + 2 bits | 37 + 2 bits | | |(- 104 + 2 bits)|(- 81 + 2 bits) | +----------------+----------------+----------------+ A.2. Analysis of change patterns of header fields To design suitable mechanisms for efficient compression of all header fields, their change patterns must be analyzed. For this Zhang (ed.), et al. [Page 49] draft-ietf-rohc-tcp-00.txt reason, an extended classification is done based on the general classification in 2, considering the fields which were labeled CHANGING in that classification. Different applications will use the fields in different ways, which may affect their behavior. For the fields whose behavior is variable, typical behavior for conversational audio and video will be discussed. The CHANGING fields are separated into five different subclasses: STATIC These are fields that were classified as CHANGING on a general basis, but are classified as STATIC here due to certain additional assumptions. SEMISTATIC These fields are STATIC most of the time. However, occasionally the value changes but reverts to its original value after a known number of packets. RARELY-CHANGING (RC) These are fields that change their values occasionally and then keep their new values. ALTERNATING These fields alternate between a small number of different values. IRREGULAR These, finally, are the fields for which no useful change pattern can be identified. To further expand the classification possibilities without increasing complexity, the classification can be done either according to the values of the field and/or according to the values of the deltas for the field. When the classification is done, other details are also stated regarding possible additional knowledge about the field values and/or field deltas, according to the classification. For fields classified as STATIC or SEMISTATIC, the case could be that the value of the field is not only STATIC but also well KNOWN a priori (two states for SEMISTATIC fields). For fields with non-irregular change behavior, it could be known that changes usually are within a LIMITED range compared to the maximal change for the field. For other fields, the values are completely UNKNOWN. Table 1 classifies all the CHANGING fields on the basis of their expected change patterns. (4) refers to IPv4 fields and (6) refers to IPv6. +------------------------+-------------+-------------+------------+ | Field | Value/Delta | Class | Knowledge | +========================+=============+=============+============+ | IP TOS(4) / Tr.Class(6)| Value | RC | UNKNOWN | +------------------------+-------------+-------------+------------+ | IP ECT flag(4) | Value | RC | UNKNOWN | Zhang (ed.), et al. [Page 50] draft-ietf-rohc-tcp-00.txt +------------------------+-------------+-------------+------------+ | IP CE flag(4) | Value | RC | UNKNOWN | +------------------------+-------------+-------------+------------+ | Sequential | Delta | STATIC | KNOWN | | -----------+-------------+-------------+------------+ | IP Id(4) Seq. jump | Delta | RC | LIMITED | | -----------+-------------+-------------+------------+ | Random | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | IP DF flag(4) | Value | RC | UNKNOWN | +------------------------+-------------+-------------+------------+ | IP TTL(4) / Hop Lim(6) | Value | ALTERNATING | LIMITED | +------------------------+-------------+-------------+------------+ | TCP Sequence Number | Delta | IRREGULAR | LIMITED | +------------------------+-------------+-------------+------------+ | TCP Acknowledgement Num| Delta | IRREGULAR | LIMITED | +------------------------+-------------+-------------+------------+ | TCP Reserved | Value | RC | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP ECN flags | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP CWR flag | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP ECE flag | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP URG flag | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP ACK flag | Value | SEMISTATIC | KNOWN | +------------------------+-------------+-------------+------------+ | TCP PSH flag | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP RST flag | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP SYN flag | Value | SEMISTATIC | KNOWN | +------------------------+-------------+-------------+------------+ | TCP FIN flag | Value | SEMISTATIC | KNOWN | +------------------------+-------------+-------------+------------+ | TCP Window | Value | ALTERNATING | KNOWN | +------------------------+-------------+-------------+------------+ | TCP Checksum | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ | TCP Urgent Pointer | Value | IRREGULAR | KNOWN | +------------------------+-------------+-------------+------------+ | TCP Options | Value | IRREGULAR | UNKNOWN | +------------------------+-------------+-------------+------------+ Table 1 : Classification of CHANGING header fields The following subsections discuss the various header fields in detail. Note that table 1 and the discussions below do not consider changes caused by loss or reordering before the compression point. Zhang (ed.), et al. [Page 51] draft-ietf-rohc-tcp-00.txt A.2.1. IP header fields A.2.1.1. IP Traffic-Class / Type-Of-Service (TOS) The Traffic-Class (IPv6) or Type-Of-Service (IPv4) field might be expected to change during the lifetime of a packet stream. This analysis considers several RFCs that describe modifications to the original [RFC791]. The TOS byte was initially described in [RFC791] as 3 bits of precedence followed by 3 bits of TOS and 2 reserved bits (defined to be 0). [RFC1122] extended this to specify 5 bits of TOS, although the meanings of the additional 2 bits were not defined. [RFC1349] defined the 4th bit of TOS to be 'minimize monetary cost'. The next significant change was in [RFC2474] which reworked the TOS octet as 6 bits of DSCP (DiffServ Code Point) plus 2 unused bits. Most recently [RFC2780] identified the 2 reserved bits in the TOS or traffic class octet for experimental use with ECN. For the purposes of this classification, it is therefore proposed to classify the TOS (or traffic class) octet as 6 bits for the DSCP and 2 additional bits. This may be expected to be 0 or to contain ECN data. From a future proofing perspective, it is preferable to assume the use of ECN, especially with respect to TCP. It is also considered important that the profile works with legacy stacks, since these will be in existence for some considerable time to come. For simplicity, this will be considered as 6 bits of TOS information and 2 bits of ECN data, so the fields are always considered to be structured the same way. The DSCP (as for TOS in ROHC RTP) is not expected to change frequently. A.2.1.2. ECN Flags Initially we describe the ECN flags as specified in [RFC2481]. Subsequently, a suggested update is described which would alter the behavior of the flags. In [RFC2481] there are 2 separate flags, the ECT (ECN Capable Transport) flag and the CE (Congestion Experienced) flag. The ECT flag, if negotiated by the TCP stack, will be on for all data packets and off for all 'pure acknowledgement' packets. This means that the behavior of the ECT flag is linked to behavior in the TCP stack. Whether this can be exploited for compression is not clear. The CE flag is only used if ECT is set to on and indicates congestion in the network. The CE flag is expected to be randomly (and comparatively rarely, although this is dependent upon the network congestion state) set to '1'. Zhang (ed.), et al. [Page 52] draft-ietf-rohc-tcp-00.txt A recent draft [nonce] suggests an alternative view of these 2 bits. This considers the two bits together as having 4 possible codepoints. Meanings are then assigned to the codepoints: 00 Not ECN capable 01 ECN capable, no congestion [known as ECT(0)] 10 ECN capable, no congestion [known as ECT(1)] 11 Congestion experienced The use of 2 codepoints for signaling ECT allows the sender to detect when a receiver is not reliably echoing congestion information. For the purposes of compression, this update means that ECT(0) and ECT(1) are equally likely (for an ECN capable flow) and that “11” will be relatively rarely seen. A.2.1.3. IP Identification The Identification field (IP ID) of the IPv4 header is there to identify which fragments constitute a datagram when reassembling fragmented datagrams. The IPv4 specification does not specify exactly how this field is to be assigned values, only that each packet should get an IP ID that is unique for the source-destination pair and protocol for the time the datagram (or any of its fragments) could be alive in the network. This means that assignment of IP ID values can be done in various ways, which we have separated into three classes: Sequential jump This is the most common assignment policy in today's IP stacks. A single IP ID counter is used for all packet streams. When the sender is running more than one packet stream simultaneously, the IP ID can increase by more than one between packets in a stream. The IP ID values will be much more predictable and require less bits to transfer than random values, and the packet-to-packet increment (determined by the number of active outgoing packet streams and sending frequencies) will usually be limited. Random Some IP stacks assign IP ID values using a pseudo-random number generator. There is thus no correlation between the ID values of subsequent datagrams. Therefore there is no way to predict the IP ID value for the next datagram. For header compression purposes, this means that the IP ID field needs to be sent uncompressed with each datagram, resulting in two extra octets of header. IP stacks in cellular terminals SHOULD NOT use this IP ID assignment policy. Zhang (ed.), et al. [Page 53] draft-ietf-rohc-tcp-00.txt Sequential This assignment policy keeps a separate counter for each outgoing packet stream and thus the IP ID value will increment by one for each packet in the stream, except at wrap around. Therefore, the delta value of the field is constant and well known a priori. This assignment policy is the most desirable for header compression purposes. However, its usage is not as common as it perhaps should be. In order to avoid violating [IPv4], packets sharing the same IP address pair and IP protocol number cannot use the same IP ID values. Therefore, implementations of sequential policies must make the ID number spaces disjoint for packet streams of the same IP protocol going between the same pair of nodes. This can be done in a number of ways, all of which introduce occasional jumps, and thus makes the policy less than perfectly sequential. For header compression purposes less frequent jumps are preferred. It should be noted that the ID is an IPv4 mechanism and is therefore not a problem for IPv6. For IPv4 the ID could be handled in three different ways. First, we have the inefficient but reliable solution where the ID field is sent as-is in all packets, increasing the compressed headers by two octets. This is the best way to handle the ID field if the sender uses random assignment of the ID field. Second, there can be solutions with more flexible mechanisms requiring less bits for the ID handling as long as sequential jump assignment is used. Such solutions will probably require even more bits if random assignment is used by the sender. Knowledge about the sender's assignment policy could therefore be useful when choosing between the two solutions above. Finally, even for IPv4, header compression could be designed without any additional information for the ID field included in compressed headers. To use such schemes, it must be known which assignment policy for the ID field is being used by the sender. That might not be possible to know, which implies that the applicability of such solutions is very uncertain. However, designers of IPv4 stacks for cellular terminals SHOULD use an assignment policy close to sequential. With regard to TCP compression, the behavior of the IP ID field is considered to be essentially the same. However, it is noted that the IP ID was generally inferred from the RTP Sequence Number. There is no obvious candidate in the TCP case for a field to offer this Master sequence number role. Clearly from a busy server the observed behavior may well be quite erratic. This is a case where the ability to share the IP compression context between a number of flows (between the same end- points) would offer potential benefits. A.2.1.4. Don't Fragment (DF) flag Zhang (ed.), et al. [Page 54] draft-ietf-rohc-tcp-00.txt Due to the use of path-MTU discovery [RFC1191], the value is more likely to be '1', than found in UDP/RTP streams since DF should be periodically set to check for fragmentation in the end-to-end path. In practice it is hard to predict the behavior of this field. However, it is considered that the most likely case is that it will generally stay at either 0/1 (periodically being set to 0 or 1) A.2.1.5. IP Hop-Limit / Time-To-Live (TTL) The Hop-Limit (IPv6) or Time-To-Live (IPv4) field is expected to be constant during the lifetime of a packet stream or to alternate between a limited number of values due to route changes. A.2.2. TCP header fields Any discussion of compressability of TCP fields borrows heavily from [VJHC]. However, the premise of how the compression is performed is slightly different and the protocol has evolved slightly in the intervening time. A.2.2.1. Sequence number An understanding of the sequence and acknowledgement number behavior are essential for a TCP compression scheme. At the simplest level the behavior of the sequence number can be described relatively easily. However, there are a number of complicating factors that also need to be considered. For transferring in-sequence data packets, the sequence number will increment for each packet by between 0 and an upper limit defined by the MSS (Maximum Segment Size). However, at any point on the path (i.e. wherever a compressor might be deployed), the sequence number can be anywhere within a range defined by the TCP window. This is a combination of a number of values (buffer space at the sender; advertised buffer size at the receiver; and TCP congestion control algorithms). Missing packets or retransmissions can cause the TCP sequence number to fluctuate within the limits of this window. It would also be desirable to be able to predict the sequence number from some regularity. However, this also appears to be difficult to do. For example, during bulk data transfer the sequence number will tend to go up by 1 MSS per packet (assuming no packet loss). Higher level values have been seen to have an impact as well, where sequence number behavior has been observed with an 8 kbyte repeating pattern - 5 segments of 1460 bytes followed by 1 segment of 892 bytes. It appears that implementation and how data is presented to the stack can affect the sequence number. Zhang (ed.), et al. [Page 55] draft-ietf-rohc-tcp-00.txt It has been suggested that the TCP window can be tracked by the compressor, allowing it to bound the size of these jumps. For interactive flows (for example telnet), the sequence number will change by small irregular amounts. In this case the Nagle algorithm commonly applies, coalescing small packets where possible to reduce the basic header overhead. This may also mean that is less likely that predictable changes in the sequence number will occur. It is also noted that the SYN and FIN flags (which have to be acknowledged) consume 1 byte of sequence space. A.2.2.2. Acknowledgement number Much of the information about the sequence number applies equally to the acknowledgement number. However, there are some important differences. For bulk data transfers there will tend to be 1 acknowledgement for every 2 data segments. It may be seen from this that the delta for the acknowledgement number is roughly twice that of the sequence number. This is not always the case and the discussion about sequence number irregularity should be applied. As an aside, a common implementation bug was Stretch ACKs, (acknowledgements may be generated less frequently than every two full-size data segments). Since the acknowledgement number is cumulative, dropped packets in the forward path will result in the acknowledgement number remaining constant for a time in the reverse direction. Retransmission of a dropped segment can then cause a substantial jump in the acknowledgement number. These jumps in acknowledgement number are bounded by the TCP window, just as for the jumps in sequence number. A.2.2.3. Reserved This field is reserved and as such might be expected to be zero. This can no longer be assumed due to future proofing as it is only a matter of time before a suggestion for using the flag is made. A.2.2.4. Flags ECN-E (Explicit Congestion Notification) '1' to echo CE bit in IP header. Will be set in several consecutive headers (until 'acknowledged' by CWR) If ECN nonces get used, then there will be a 'nonce-sum' (NS) bit in the flags, as well. Again, transparency of the reserved bits Zhang (ed.), et al. [Page 56] draft-ietf-rohc-tcp-00.txt is crucial for future-proofing this compression scheme... From an efficiency/compression standpoint, the NS bit will either be unused [always 0] or randomly changing) CWR (Congestion Window Reduced) '1' to signal congestion window reduced on ECN. Will generally be set in individual packets ECE (Echo Congestion Experience) If Congestion experienced is signaled on a received IP header, this is echoed through the ECE bit in segments sent by the receiver until acknowledged by seeing the CWR bit set. During connection open (SYN and SYN/ACK packets) the ECN bits have special meaning: CWR + ECN-E are both set with SYN to indicate desire to use ECN CWR only is set in SYN-ACK to agree ECN (The difference in bit-patterns for the negotiation is so that it will work with broken stacks that reflect the value of reserved bits) URG (Urgent Flag) '1' to indicate urgent data [unlikely with any flag other than ACK] ACK (Acknowledgement) '1' for all except the initial 'SYN' packet PSH (Push Function Field) generally accepted to be randomly '0' or '1'. However, may be biased more to one value than the other (this is largely down to the implementation of the stack) RST (Reset Connection) '1' to reset a connection [unlikely with any flag other than ACK] SYN (Synchronize Sequence Number) '1' for the SYN/SYN-ACK only at the start of a connection FIN (End of Data : FINished) '1' to indicate 'no more data' [unlikely with any flag other than ACK] Zhang (ed.), et al. [Page 57] draft-ietf-rohc-tcp-00.txt A.2.2.5. Checksum Carried as the end-to-end check for the TCP data. See [RFC 1144] for a discussion of why this should be carried. There may be more complex interactions with error detection and robustness that would have to be addressed in a TCP header compression scheme. The TCP checksum has to be considered as randomly changing. A.2.2.6. Window May oscillate randomly between 0 and the receiver window limit (for the connection). In practice, the window would not change, or may alternate between a relatively small number of values. Particularly when closing (the value is getting smaller), the change in window is likely to be related to the segment size, but it not clear that this necessarily offers any compression advantage. When the window is opening, the effect of Silly-Window Syndrome avoidance should be remembered. This prevents the window opening by small amounts that would encourage the sender to clock out small segments. When thinking about what fields might change in a sequence of TCP segments, it should be noted that the receiver can generate 'window update' segments in which only the window advertisement changes. A.2.2.7. Urgent pointer From a compression point of view, the Urgent Pointer is interesting because it offers an example where Semantically identical compression is not the same as Bitwise identical. This is because the value of the Urgent Pointer is only valid if the URG flag is set. However, from the discussion of the TCP Checksum above, it should be realized that this enforces bitwise transparency of the scheme and so this argument is not particularly important. If the URG flag is set, then this pointer indicates the end of the urgent data and so can be point to anywhere in the window. This may be set (and changing) over several segments. Note that urgent data is rarely used, since it is not a particularly clean way of managing out-of-band data. A.2.3. Options Options occupy space at the end of the TCP header. All options are included in the checksum. An option may begin on any byte boundary. The TCP header must be padded with zeros to make the header length a multiple of 32 bits. Zhang (ed.), et al. [Page 58] draft-ietf-rohc-tcp-00.txt Optional header fields are identified by an option kind field. Options 0 and 1 are exactly one octet that is their kind field. All other options have their one octet kind field, followed by a one octet length field, followed by length-2 octets of option data. A.2.3.1. Options overview Table 2 classifies the IANA known options together with their associated RFCs, if applicable [IANA] +------+--------+------------------------------------+-----------+ | Kind | Length | Meaning | RFC | | |(octets)| | | +------+--------+------------------------------------+-----------+ | 0 | - | End of Option List | [RFC793] | | 1 | - | No-Operation | [RFC793] | | 2 | 4 | Maximum Segment Size | [RFC793] | | 3 | 3 | WSopt - Window Scale | [RFC1323] | | 4 | 2 | SACK Permitted | [RFC2018] | | 5 | N | SACK | [RFC2018] | | 6 | 6 | Echo (obsoleted by option 8) | [RFC1072] | | 7 | 6 | Echo Reply (obsoleted by option 8) | [RFC1072] | | 8 | 10 | TSopt - Time Stamp Option | [RFC1323] | | 9 | 2 | Partial Order Connection Permitted | [RFC1693] | | 10 | 3 | Partial Order Service Profile | [RFC1693] | | 11 | 6 | CC | [RFC1644] | | 12 | 6 | CC.NEW | [RFC1644] | | 13 | 6 | CC.ECHO | [RFC1644] | | 14 | 3 | Alternate Checksum Request | [RFC1146] | | 15 | N | Alternate Checksum Data | [RFC1146] | | 16 | | Skeeter | | | 17 | | Bubba | | | 18 | 3 | Trailer Checksum Option | | | 19 | 18 | MD5 Signature Option | [RFC2385] | | 20 | | SCPS Capabilities | | | 21 | | Selective Negative Acknowledgements| | | 22 | | Record Boundaries | | | 23 | | Corruption experienced | | | 24 | | SNAP | | | 25 | | Unassigned (released 12/18/00) | | | 26 | | TCP Compression Filter | | +------+--------+------------------------------------+-----------+ Table 2 Description of common TCP options A.2.3.2. Option field behavior Generally speaking all option fields have been classified as changing. This section describes the behavior of each option referenced within an RFC, listed by kind indicator. Zhang (ed.), et al. [Page 59] draft-ietf-rohc-tcp-00.txt 0. End of option list This option code indicates the end of the option list. This might not coincide with the end of the TCP header according to the Data Offset field. This is used at the end of all options, not the end of each option, and need only be used if the end of the options would not otherwise coincide with the end of the TCP header. [RFC793] There is no data associated with this option, a compression scheme must simply be able to encode its presence. 1. No-Operation This option code may be used between options, for example, to align the beginning of a subsequent option on a word boundary. There is no guarantee that senders will use this option, so receivers must be prepared to process options even if they do not begin on a word boundary [RFC793]. There is no data associated with this option, a compression scheme must simply be able to encode its presence. 2. Maximum Segment Size If this option is present, then it communicates the maximum receive segment size at the TCP that sends this segment. This field must only be sent in the initial connection request (i.e., in segments with the SYN control bit set). If this option is not used, any segment size is allowed [RFC793]. This option is very common. The segment size is a 16-bit quantity. Theoretically this could take any value, however there are a number of values that are more common. For example, 1460 bytes are very common for TCP/IPv4 over Ethernet. 536 bytes is the default MSS value. This may allow for common values to be encoded more efficiently. 3. Window Scale Option (WSopt) This option may be sent in a SYN segment by TCP: (1) to indicate that it is prepared to do both send and receive window scaling, and (2) to communicate a scale factor to be applied to its receive window. Zhang (ed.), et al. [Page 60] draft-ietf-rohc-tcp-00.txt The scale factor is encoded logarithmically, as a power of 2 (presumably to be implemented by binary shifts). Note: the window in the SYN segment itself is never scaled [RFC1072]. This option may be sent in an initial segment (i.e., a segment with the SYN bit on and the ACK bit off). It may also be sent in a segment, but only if a Window Scale option was received in the initial segment. A Window Scale option in a segment without a SYN bit should be ignored. The Window field in a SYN segment itself is never scaled [RFC1323] The use of window scaling does not affect the encoding of any other field during the life-time of the flow. It is only the encoding of the window scaling option itself that is important. The window scale must be between 0 and 14 (inclusive). Generally smaller values would be expected (a window scale of 14 allows for a 1Gbyte window, which is extremely large). 4. SACK-Permitted This option may be sent in a SYN by a TCP that has been extended to receive (and presumably process) the SACK option once the connection has opened [RFC2018]. There is no data in this option, all that is required is for the presence of the option to be encoded. 5. SACK This option is to be used to convey extended acknowledgment information over an established connection. Specifically, it is to be sent by a data receiver to inform the data transmitter of non- contiguous blocks of data that have been received and queued. The data receiver is awaiting the receipt of data in later retransmissions to fill the gaps in sequence space between these blocks. At that time, the data receiver will acknowledge the data normally by advancing the left window edge in the Acknowledgment Number field of the TCP header. It is important to understand that the SACK option will not change the meaning of the Acknowledgment Number field, whose value will still specify the left window edge, i.e., one byte beyond the last sequence number of fully-received data [RFC2018]. If SACK has been negotiated (through an exchange of SACK- Permitted options), then this option may occur when dropped segments are noticed by the receiver. Because this identifies ranges of blocks within the receiver window, this can be viewed as a base value with a number of offsets. There can be up to 4 SACK blocks in Zhang (ed.), et al. [Page 61] draft-ietf-rohc-tcp-00.txt a single option. SACK blocks may occur in a number of segments (if there is more out-of-order data n the wire? and this will typically extend the size of or add to the existing blocks. Alternative proposals such as DSACK [RFC2883] do not fundamentally change the behavior of the SACK block, from the point of view of the information contained within it. 6. - 7. These options are generally not used in practice. It is obsoleted by the Timestamp option. However, for transparency it is desirable that a compression scheme be able to encode it. 8. Timestamps This option carries two four-byte timestamp fields. The Timestamp Value field (TSval) contains the current value of the timestamp clock of the TCP sending the option. The Timestamp Echo Reply field (TSecr) is only valid if the ACK bit is set in the TCP header; if it is valid, it echoes a timestamp value that was sent by the remote TCP in the TSval field of a Timestamps option. When TSecr is not valid, its value must be zero. The TSecr value will generally be from the most recent Timestamp option that was received; however, there are exceptions that are explained below. A TCP may send the Timestamps option (TSopt) in an initial segment (i.e., segment containing a SYN bit and no ACK bit), and may send a TSopt in other segments only if it received a TSopt in the initial segment for the connection [RFC1323]. Timestamps are quite commonly used. If timestamp options are exchanged in the connection set-up phase, then they will appear on all subsequent segments. If this exchange does not happen, then they will not appear for the remainder of the flow. Because the value being carried is a timestamp, it is logical to expect that the entire value need not be carried. There is no obvious pattern of increments that might be expected, however. An important reason for using the timestamp option is to allow detection of sequence space wrap-around (Protection Against Wrapped Sequence-number, or PAWS [RFC1323]). It is not expected that this is serious concern on the links that TCP header compression would be deployed on, but it is important that the integrity of this option is maintained. 9. - 13. Those options are in practice never seen, and so the only requirement is that the header compression scheme should be able to encode it. 14. Alternate Checksum Request Zhang (ed.), et al. [Page 62] draft-ietf-rohc-tcp-00.txt This option may be sent in a SYN segment by a TCP to indicate that the TCP is prepared to both generate and receive checksums based on an alternate algorithm. During communication, the alternate checksum replaces the regular TCP checksum in the checksum field of the TCP header. Should the alternate checksum require more than 2 octets to transmit, the checksum may either be moved into a TCP Alternate Checksum Data Option and the checksum field of the TCP header be sent as 0, or the data may be split between the header field and the option. Alternate checksums are computed over the same data as the regular TCP checksum [RFC1146] This option is in practice never seen, and so the only requirement is that the header compression scheme should be able to encode it. It would only occur in connection set-up (SYN) packets. Even if this option were used, it would not affect the handling of the checksum, since this should be carried transparently in any case. 15. Alternate Checksum Data This field is used only when the alternate checksum that is negotiated is longer than 16 bits. These checksums will not fit in the checksum field of the TCP header and thus at least part of them must be put in an option. Whether the checksum is split between the checksum field in the TCP header and the option or the entire checksum is placed in the option is determined on a checksum by checksum basis. The length of this option will depend on the choice of alternate checksum algorithm for this connection [RFC1146]. If an alternative checksum were negotiated in the connection set-up, then this option may appear on all subsequent packets (if needed to carry the checksum data). However, this option is in practice never seen, and so the only requirement is that the header compression scheme should be able to encode it. 16. - 18. Are non-RFC references and are not considered in this document. 19. MD5 Digest Every segment sent on a TCP connection to be protected against spoofing will contain the 16-byte MD5 digest produced by applying the MD5 algorithm to a concatenated block of data. Upon receiving a signed segment, the receiver must validate it by calculating its own digest from the same data (using its own key) and comparing the two digest. A failing comparison must result in the segment being dropped and must not produce any response back to Zhang (ed.), et al. [Page 63] draft-ietf-rohc-tcp-00.txt the sender. Logging the failure is probably advisable. Unlike other TCP extensions (e.g., the Window Scale option [RFC1323]), the absence of the option in the SYN, ACK segment must not cause the sender to disable its sending of signatures. This negotiation is typically done to prevent some TCP implementations from misbehaving upon receiving options in non-SYN segments. This is not a problem for this option, since the SYN, ACK sent during connection negotiation will not be signed and will thus be ignored. The connection will never be made, and non-SYN segments with options will never be sent. More importantly, the sending of signatures must be under the complete control of the application, not at the mercy of the remote host not understanding the option. MD5 digest information should, like any cryptographically secure data, be incompressible. Therefore the compression scheme must simply transparently carry this option, if it occurs. 20. - 26. Are non-RFC references and are not considered in this document. 5. Other observations 5.1. Implicit acknowledgements There may be a small number of cues for 'implicit acknowledgements' in a TCP flow. Even if the compressor only sees the data transfer direction, for example, then seeing a packet without the SYN flag set implies that the SYN packet has been received. It may be that there are other such cues that may be used in certain circumstances to improve compression efficiency. 5.2. Shared data At the risk of drifting into solution space, it can be seen that there are two distinct deployments - one where the forward and reverse paths share a link and one where they do not. In the former case it may be the case that a compressor and decompressor could be co-located. It may then be possible for the compressor and decompressor at each end of the link to exchange information. This could lead to possible optimizations. For example, acknowledgement numbers are generally taken from the sequence numbers in the opposite direction. Since an acknowledgement cannot be generated for a packet that has not passed across the link, this offers an efficient way of encoding acknowledgements. Zhang (ed.), et al. [Page 64] draft-ietf-rohc-tcp-00.txt 5.2.1. TCP header overhead For a TCP bulk data-transfer the overhead is not that onerous, particularly compared to the typical RTP voice case. Although spectral efficiency is clearly an important goal, it does not seem critical to extract every last bit of compression gain. However, in the acknowledgement direction (i.e. for 'pure' acknowledgement headers) the overhead could be said to be infinite (since there is no data being carried). This is why optimizations for the acknowledgement path may be considered useful. 5.3. Short-lived flows It is hard to see what can be done to improve performance for a single, unpredictable, short-lived connection. However, there are commonly cases where there will be multiple TCP connections between the same pair of hosts. As a particular example, consider web browsing (this is more the case with HTTP/1.0 than HTTP/1.1). When a connection closes, it is either the last connection between that pair of hosts or it is likely that another connection will open within a relatively short space of time. In this case, the IP header part of the context will probably be almost identical. Certain aspects of the TCP context may also be similar. For example, it may be that one of the port numbers will stay the same (the service port) and the other will change by a small amount relative to the just-closed connection (the ephemeral port). Also, unless [RFC1948] ISN selection is implemented, the initial sequence number for the SYN packet may be 'close' to the sequence number range used for the closed connection. Thus, support for sub-context sharing, or initializing one context from another offers useful optimizations for a sequence of short- lived connections. It is noted that although TCP is connection oriented, it is hard to tell at a middle-box whether or not a TCP flow has finished. For example, even in the 'bi-directional' link case, seeing a FIN and the ACK of the FIN at the compressor/decompressor does not mean that the FIN cannot be retransmitted. Thus it may be more useful to think about initializing a new context from an existing one, rather than re-using an existing one. Zhang (ed.), et al. [Page 65]