Network Working Group Jerry Ash Internet Draft Bur Goode Jim Hand Expiration Date: October 2003 AT&T March, 2003 End-to-End VoIP Header Compression Using cRTP Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of 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 obsoleted 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: VoIP typically uses the encapsulation voice/RTP/UDP/IP, wherein the packet header is at least 40 bytes, while the voice payload is typically no more than 30 bytes. VoIP header compression can significantly reduce the VoIP overhead through various compression mechanisms. This is important on access links where bandwidth is scarce, and can be important on backbone facilities, especially where costs are high (e.g., some global cross-sections). In this draft we propose to re-use the methods in cRTP to determine the header compression context and to use the cRTP session context ID to route a compressed packet between the ingress and egress routers. Table of Contents 1. Introduction 2. Overview of End-to-End VoIP Header Compression Using cRTP 3. Protocol Extensions 3.1 Routing Compressed Packets with cRTP SCID Switching (No MPLS Forwarding in Path) 3.2 Routing Compressed Packets with cRTP SCID Switching (MPLS Forwarding in Path) 4. Security Considerations 5. References 6. Authors' Addresses 7. Full Copyright Statement 1. Introduction Voice over IP (VoIP) typically uses the encapsulation voice/RTP/UDP/IP/, wherein the packet header is at least 40 bytes, while the voice payload is typically no more than 30 bytes. The interest in VoIP header compression is the possibility of significantly reducing the VoIP overhead through various compression mechanisms. The need may be important on access links where bandwidth is more scarce, but it could be important on backbone facilities, especially where costs are high (e.g., some global cross-sections). Typically, VoIP will use voice compression mechanisms (e.g., G.729) in order to conserve bandwidth. With VoIP header compression, significantly more bandwidth could be saved. For example, carrying VoIP headers for the entire voice load of a large domestic network with 300 million or more calls per day could consume on the order of about 20-40 gigabits-per-second on the backbone network for headers alone. This overhead could translate into considerable bandwidth capacity. In principle, we could use existing header compression techniques, such as those described in [cRTP], to make the transport of the RTP/UDP/IP headers more efficient. [cRTP] header compression is often used on the access links from the CE router to the PE router. However, cRTP header compression must be implemented on a hop-by-hop basis, and does not scale well for large voice traffic loads. To implement 'end-to-end' VoIP header compression, a method of routing the compressed packets end-to-end is needed. In [VoMPLS], it is proposed that the ingress router would apply header compression to the IP packet and use an MPLS label for routing the compressed packet to the egress router, where the full header would be restored. Here we propose to extend [cRTP] in two ways. First, we describe a technique to enable packets compressed with the techniques used in [cRTP] to flow across multiple contiguous compression-enabled links, without requiring a decompression/compression cycle at each transit router. This technique uses the cRTP session context ID (SCID) to route the compressed packet between ingress and egress routers, in a manner analogous to switching MPLS packets based on MPLS labels. A method is described to associate the SCID and the next hop in the routing table, and also to set up a correspondence between the header compression tables at the ingress and egress routers in the session. Second, a means is described to send header-compressed traffic over the type of MPLS VPN infrastructure specified in [MPLS-VPN]. This method encapsulates header-compressed packets over an LSP set up using RSVP-TE tunnels as described in [RSVP-TE] between provider-edge routers (PE's). The tunnels between PE's act as a logical point-to-point link between PE's over which header-compressed traffic may be sent. The result of these two extensions is a means of extending [cRTP] end-to-end between customer-premises routers through an MPLS network (or other topology) without requiring any compression/decompression cycles on transit routers. Note that the techniques described in this document enable end-to-end header compression, but they do not require it. Header compression can be enabled on links independently (with an MPLS VPN PE-to-PE association considered a single link). If multiple contiguous links on a path are capable of, and configured for, transporting packets using RFC2508-style header compression, then this document describes a means by which transit routers between these links can avoid performing decompression/compression cycles on most of the compressed packets. On the other hand, if there are one or more transit links that cannot transport packets using header compression, this technique will still work on the remaining parts of the path where there are contiguous links that support header compression. This technique also enables end-to-end header compression in an MPLS VPN environment without any changes to the existing RFC2508-style header compression in Customer Edge (CE) routers. In this draft we propose to re-use the methods in cRTP to determine the header compression context and to use the cRTP context ID to route a compressed packet between the ingress and egress router. We recommend using enhancements to cRTP that would minimize feedback based error recovery using CONTEXT_STATE packets [cRTP-ENHANCE] to make cRTP more tolerant of packet loss, and minimize the need to use the cRTP error recovery mechanism. The reason is that basic cRTP would perform best with very low packet error rates on all hops of the path. Tunneling a cRTP session through multiple IP hops will increase the round trip delay and the chance of packet loss. cRTP contexts are invalidated due to packet loss. The cRTP error recovery mechanism using CONTEXT_STATE packets can compound the problem when long round trip delays are involved. When the cRTP decompressor context state gets out of synch with the compressor, it will drop packets associated with the context until the two states are resynchronized. To resynchronize context state at the two ends, the decompressor transmits the CONTEXT_STATE packet to the compressor, and the compressor transmits a FULL_HEADER packet to the decompressor. If the resynchronization were rare, then the basic cRTP approach would perform well for end-to-end header compression. Otherwise, enhanced cRTP is desirable. The extensions to [cRTP] described here do not preclude the use of the enhancements to [cRTP] described in [cRTP-ENHANCE]. Compressing and decompressing headers at the ingress and egress routers (versus, say, the backbone routers) disperses the header compression computational load among many routers, and may achieve better scalability. Section 2 presents the requirements for end-to-end VoIP header compression, and Section 3 presents the proposed protocol extensions. 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 RFC2119 [KEY]. 2. Overview of End-to-End VoIP Header Compression Using cRTP Header compression based on [cRTP] must be supported and configured on each link in the path in order for end-to-end header compression to work. If there are any 'holes"'in header-compression support along the path, then the router at the upstream end of the 'hole' must decompress the packet, and the router and the downstream end of the 'hole' must compress the packet again. Note a traversal of an MPLS network is considered a single link. On IP-only routers and MPLS edge routers, once compression contexts are established, the SCID is used to determine the next hop in the routing table without decompressing the packet header. Header-compressed packets are switched normally using only MPLS labels on MPLS core routers. The goal of cRTP header compression is to reduce the IP/UDP/RTP headers to two bytes for most packets in the case where no UDP checksums are being sent, or four bytes with checksums. (Note that the UDP checksum is required for cRTP-ENHANCE, so the compressed headers would be four bytes.) In cRTP header compression, the first factor-of-two reduction in header size comes from the observation that half of the bytes in the IP/UDP/RTP headers remain constant over the life of the connection. After sending the uncompressed header template once, these fields may be removed from the compressed headers that follow. The remaining compression comes from the observation that although several fields change in every packet, the difference from packet to packet is often constant and therefore the second-order difference is zero. By maintaining both the uncompressed header and the first-order differences in the session state shared between the compressor and decompressor, all that must be communicated is an indication that the second-order difference was zero. In that case, the decompressor can reconstruct the original header without any loss of information simply by adding the first-order differences to the saved uncompressed header as each compressed packet is received. The compressed packet carries a small integer, called the session context identifier or SCID, to indicate in which session context that packet should be interpreted. The decompressor can use the SCID to index its table of stored session contexts directly. The cRTP FULL-HEADER packet is used to establish the SCID routing table in each router in the path as described in the following section. The compressor communicates the SCID on each compressed packet to the decompressor (and to each router in the path). The decompressor uses the information in the cRTP FULL-HEADER packet to reconstruct the packet header information. 3. Protocol Extensions We consider two scenarios in this section, first where no MPLS forwarding is involved in end-to-end header compression path, and second where MPLS forwarding is involved somewhere in the path. 3.1 Routing Compressed Packets with cRTP SCID Switching (No MPLS Forwarding in Path) We assume that a VoIP flow is routed from R1 --> R2 --> R3 --> R4, where each router in the path supports cRTP header compression. The ingress router R1 receives a VoIP packet and determines that the next_hop router R2 supports cRTP header compression. As such, router R1 follows the procedures in [cRTP] and sends a FULL_HEADER packet on the link to R2. A FULL_HEADER packet is a packet with an uncompressed header in which: a. the link layer packet type field is modified to indicate that it is not a normal IP packet b. the 8-bit or 16-bit SCID and the 4-bit initial sequence number are encoded in the length fields of the packet. Router R2 processes the FULL_HEADER packet information to determine the next_hop for the packet based on the destination IP address and perhaps other routing information in the FULL_HEADER packet. Router R2 determines if the next_hop router, router R3, supports cRTP header compression, and since it does in this example, router R2 creates an entry in the SCID routing table which associates the SCID with the next_hop. The SCID routing tables contains the following information: a. Incoming interface b. Incoming SCID c. Outgoing interface d. Outgoing SCID Router R2 assigns a unique outgoing SCID for this VoIP flow. The entry in the SCID routing table must be tied to the IP routing table entry that was used to route the packet to the outgoing interface. This allows the context routing table entry to be invalidated if the associated IP route were removed. Router R2 then sends the FULL_HEADER packet to router R3. Router R3 performs the same function to create the SCID routing table entry for the next_hop to router R4 and sends the FULL_HEADER packet to router R4. Router R4 processes the FULL_HEADER packet in a similar manner, however at this point router R4 determines that the next_hop router does not support cRTP. Router R4 then becomes the decompressor for this SCID session, and stores the FULL_HEADER information, SCID, and sequence number as the context for the flow, as described in [cRTP]. Router R4 does not transmit the FULL_HEADER packet any further. Router R1 sends compressed packets for this VoIP session, with the associated SCID, to router R2. Router R2 uses the SCID to access the next_hop from its SCID routing table, as does router R3. Router R4 recognizes that it is the decompressor for this SCID, and performs the normal decompressing functions [cRTP]. From router R4, the packet is sent to the normal IP routing function for routing. As new, compressed packets arrive on the incoming interface for the flow, rather than decompressing the packets and using normal IP routing to route the packets, the router can instead look up the pair in the SCID routing table. This lookup will return the outgoing interface and outgoing SCID. The router can then route the packet to the outgoing interface and rewrite the header to contain the new SCID, and possibly update other parts of the header, such as the sequence number. If compressed packets arrive on the interface, and there is a valid SCID on the incoming interface, but there is no entry for the SCID in the SCID routing table, then the packet is de-compressed, and routed using normal IP routing. If the outgoing interface determined by the normal IP routing process supports [cRTP], then the router may send the packet as a FULL_HEADER packet on the outgoing interface, and then add an entry to the SCID routing table, so that subsequent packets may be switched without a decompression/compression cycle. If there is a change to the IP routing table that changes the next_hop that would be used for the destination IP address of any contexts in the SCID routing table, then these contexts should be removed from the SCID routing table. SCID switching is not applied to FULL_HEADER or CONTEXT_STATE packets. FULL_HEADER packets re-initialize the flow associated with an SCID, possibly associating a new flow with an SCID. Therefore, when a FULL_HEADER packet is received on an interface, any entries in the SCID routing table which match the incoming interface and SCID of the FULL_HEADER packet should be removed. Similarly, when a CONTEXT_STATE packet is received on an interface, any entries in the SCID routing table in which the incoming interface of the CONTEXT_STATE packet matches the outgoing interface of the SCID routing table entry, and the SCID(s) in the CONTEXT_STATE packet matches the outgoing SCID of the SCID routing table entry, should be removed from the table. This procedure does NOT require SCIDs to be the same size on the incoming and outgoing interfaces. Compliant implementations MUST be able to switch packets between interfaces that use different size SCIDs [i.e. 8-bit vs. 16-bit]. 3.2 Routing Compressed Packets with cRTP SCID Switching (MPLS Forwarding in Path) We assume that a VoIP flow is routed from CE1 --> PE1 --> P --> PE2 --> CE2, where each router in the path supports cRTP header compression. MPLS procedures and objects for end-to-end (CE1-CE2) cRTP-based header compression are given in [VoMPLS]. Here we discuss the application of these procedures to VoIP flows in which the CE1-PE1 and PE2-CE2 legs use cRTP without MPLS, and the PE1-PE2 'leg' uses MPLS procedures. The basic means of extending [cRTP] over MPLS networks is to add a label stack to header-compressed packets at the PE router, send it over the MPLS network as normal MPLS traffic, and then remove the label stack at PE2. Header compression is transparent to core (P) LSRs. [cRTP] is specified for point-to-point links, and assumes a single VPN. We need to extend the operation of [cRTP] to MPLS VPNs. The extensions must a) set up LSPs over which header-compressed packets may be sent, and b) handle the fact that [cRTP] assumes point-to-point connectivity. In particular, a decompressor must know the upstream neighbor for each SCID, so that it can send CONTEXT_STATE packets to it. Also, in [cRTP] the compressor assigns SCIDs to flows. Because there is only a single compressor on each link, the compressor owns the SCID space and can trivially guarantee that SCIDs are unique. However, with MPLS, several compressors may be sending to a single decompressor over a link. A method is provided in [VoMPLS] to ensure that the assignment of SCIDs to flows is unique. The VPN associated with each flow must also be identified. RSVP-TE is used to set up two LSP tunnels, one in each direction, between PE routers, as a logical, full-duplex point-to-point link. [cRTP] is then run over the link. New RSVP-TE objects are proposed in [VoMPLS] to allow PE1 to request a unique SCID(s) from PE2, and for PE2 to communicate the SCID assignment(s) back to PE1. All SCID assignments are associated with a particular LSP. [cRTP-ENCAP] uses a separate link-layer packet type defined for header compression. Using a separate link-layer packet type for every packet type used in header compression avoids the need to add extra bits to the compression header to identify the packet type. However, this practice does not extend well to MPLS encapsulation conventions [MPLS-ENCAP], in which a separate link-layer packet type translates into a separate LSP for each packet type. So for extending [cRTP] over MPLS VPNs, each packet type defined in [cRTP] MUST have prepended to it a packet type field. This field adds 1 octet to the header, and is encoded as follows (most significant bit is 0): 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Packet Type | Resvd | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ where: "Packet Type" is encoded with the following values: 0: Reserved 1: FULL_HEADER 2: COMPRESSED_TCP 3: COMPRESSED_TCP_NODELTA 4: COMPRESSED_NON_TCP 5: COMPRESSED_RTP_8 6: COMPRESSED_RTP_16 7: COMPRESSED_UDP_8 8: COMPRESSED_UDP_16 9: CONTEXT_STATE "Resvd" is reserved and must be set to 0. In order to identify the VPN associated with each flow, FULL_HEADER packets sent over LSRs set up for compressed traffic MUST be pre-pended with the VPN ('bottom') label that would be pushed onto the packet's MPLS label stack by the sending PE [MPLS-VPN], if the packet were being sent uncompressed. This VPN label is the VPN identifier. The VPN label must also be added to the context state kept for each flow by the compressor and decompressor. PE2 can use the VPN label to route packets associated with the context, should PE2 need to decompress these packets. Other types of compressed packets sent over MPLS VPNs MUST NOT have the VPN label prepended, since it is not necessary once the FULL_HEADER packet has set up the compression context. 3.2.1 Header Compression Object Formats A new L3PID (ethertype), XXXX, is defined in [RSVP-TE] for RFC2508 header compression over MPLS LSPs. This is needed to define the type of traffic used in RSVP-TE Label Request Objects. An SCID_Request object and Header_Compression_Reply object are defined in [VoMPLS]. PE1 creates an LSP to PE2 router by creating an RSVP-TE PATH message that contains: a. Label_Request object with the L3PID for cRTP over MPLS VPN (XXXX - TBD), b. an SCID_Request object. PE1 will receive a RESV message containing a Label object and a Header_Compression_Reply object. PE1 uses the label and SCID to send compressed traffic to PE2. Procedures for treatment of these objects are contained in [VoMPLS]. 3.2.2 Data Plane Procedures PE1 and PE2 follow the procedures in [cRTP], including the sending of FULL_HEADER packets, compressed packets, CONTEXT_STATE packets, etc., with some exceptions. These exceptions are: 1. PE1 must associate an outgoing ('top') LSP label as part of the context state for each flow. Each outgoing flow must be associated with an outgoing interface, LSP label and SCID. 2. PE1 does not have an implicit block of 256 or 65536 SCIDs to use to assign to flows. Instead, it has a single SCID or a set of N SCIDs, which it received from PE2 and can assign to flows. Both PE1 and PE2 must keep track of which SCIDs are valid for each LSP carrying compressed traffic. 3. the 'packet type' octet described above, must be prepended to each header. 4. the VPN ('bottom') label of the two-level label stack described in [MPLS-VPN] must be pre-pended to each FULL_HEADER packet. The VPN label is maintained as part of the compression context of each compressed flow. This is needed in case PE2 must decompress and route the packet. It uses the VPN label to determine which routing table to use to route the packet. In terms of SCID switching (Section 3.1), the primary change required as a result of the extension to use MPLS is that the SCID switching table must be modified to include the outgoing label on the Upstream PE. That is, the SCID switching table must contain the following fields: a. Incoming interface b. Incoming SCID c. Outgoing interface d. Outgoing MPLS label (if the outgoing interface is MPLS) e. Outgoing SCID 4. Security Considerations No additional security risks/requirements are posed. 5. References [cRTP] Casner, S., Jacobsen, V., "Compressing IP/UDP/RTP Headers for Low-Speed Serial Links", RFC 2508, February 1999. [cRTP-ENCAP] Engan, M., Casner, S., Bormann, C., "IP Header Compression over PPP", RFC2509, February 1999. [cRTP-ENHANCE] Koren, T., et. al., "Compressing IP/UDP/RTP Headers on Links with High Delay, Packet Loss, and Reordering," work in progress. [KEY] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", RFC 2119, March 1997. [MPLS-ENCAP] Rosen, E., Tappan, D., et al, "MPLS Label Stack Encoding", RFC 3032, January 2001. [MPLS-VPN] Rosen, E., Rekhter, Y., "BGP/MPLS VPNs", RFC 2547, March 1999. [RSVP-TE] Awduche, D., "RSVP-TE: Extensions to RSVP for LSP Tunnels", RFC 3209, December 2001 [VoMPLS] Ash, G., Goode, B., Hand, J., "End-to-End VoIP over MPLS Header Compression," work in progress. 6. Authors' Addresses Jerry Ash AT&T Room MT D5-2A01 200 Laurel Avenue Middletown, NJ 07748, USA Phone: +1 732-420-4578 Email: gash@att.com Bur Goode AT&T Phone: + 1 203-341-8705 E-mail: bgoode@att.com Jim Hand AT&T Room MT A2-4F36 200 Laurel Avenue Middletown, NJ 07748, USA Phone: +1 732-420-6179 E-mail: jameshand@att.com 7. Full Copyright Statement Copyright (C) The Internet Society (2003). All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English. The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns. This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.