idnits 2.17.1 draft-ietf-rmt-pi-norm-revised-14.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- ** The document seems to lack a License Notice according IETF Trust Provisions of 28 Dec 2009, Section 6.b.i or Provisions of 12 Sep 2009 Section 6.b -- however, there's a paragraph with a matching beginning. Boilerplate error? (You're using the IETF Trust Provisions' Section 6.b License Notice from 12 Feb 2009 rather than one of the newer Notices. See https://trustee.ietf.org/license-info/.) Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- No issues found here. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document seems to contain a disclaimer for pre-RFC5378 work, and may have content which was first submitted before 10 November 2008. The disclaimer is necessary when there are original authors that you have been unable to contact, or if some do not wish to grant the BCP78 rights to the IETF Trust. If you are able to get all authors (current and original) to grant those rights, you can and should remove the disclaimer; otherwise, the disclaimer is needed and you can ignore this comment. (See the Legal Provisions document at https://trustee.ietf.org/license-info for more information.) -- The document date (September 11, 2009) is 5331 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) ** Downref: Normative reference to an Experimental RFC: RFC 4654 ** Obsolete normative reference: RFC 5226 (Obsoleted by RFC 8126) -- Obsolete informational reference (is this intentional?): RFC 3547 (Obsoleted by RFC 6407) -- Obsolete informational reference (is this intentional?): RFC 3940 (Obsoleted by RFC 5740) -- Obsolete informational reference (is this intentional?): RFC 4566 (Obsoleted by RFC 8866) Summary: 3 errors (**), 0 flaws (~~), 1 warning (==), 5 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group B. Adamson 3 Internet-Draft Naval Research Laboratory 4 Obsoletes: 3940 (if approved) C. Bormann 5 Intended status: Standards Track Universitaet Bremen TZI 6 Expires: March 15, 2010 M. Handley 7 University College London 8 J. Macker 9 Naval Research Laboratory 10 September 11, 2009 12 NACK-Oriented Reliable Multicast Transport Protocol 13 draft-ietf-rmt-pi-norm-revised-14 15 Status of this Memo 17 This Internet-Draft is submitted to IETF in full conformance with the 18 provisions of BCP 78 and BCP 79. This document may contain material 19 from IETF Documents or IETF Contributions published or made publicly 20 available before November 10, 2008. The person(s) controlling the 21 copyright in some of this material may not have granted the IETF 22 Trust the right to allow modifications of such material outside the 23 IETF Standards Process. Without obtaining an adequate license from 24 the person(s) controlling the copyright in such materials, this 25 document may not be modified outside the IETF Standards Process, and 26 derivative works of it may not be created outside the IETF Standards 27 Process, except to format it for publication as an RFC or to 28 translate it into languages other than English. 30 Internet-Drafts are working documents of the Internet Engineering 31 Task Force (IETF), its areas, and its working groups. Note that 32 other groups may also distribute working documents as Internet- 33 Drafts. 35 Internet-Drafts are draft documents valid for a maximum of six months 36 and may be updated, replaced, or obsoleted by other documents at any 37 time. It is inappropriate to use Internet-Drafts as reference 38 material or to cite them other than as "work in progress." 40 The list of current Internet-Drafts can be accessed at 41 http://www.ietf.org/ietf/1id-abstracts.txt. 43 The list of Internet-Draft Shadow Directories can be accessed at 44 http://www.ietf.org/shadow.html. 46 This Internet-Draft will expire on March 15, 2010. 48 Copyright Notice 49 Copyright (c) 2009 IETF Trust and the persons identified as the 50 document authors. All rights reserved. 52 This document is subject to BCP 78 and the IETF Trust's Legal 53 Provisions Relating to IETF Documents in effect on the date of 54 publication of this document (http://trustee.ietf.org/license-info). 55 Please review these documents carefully, as they describe your rights 56 and restrictions with respect to this document. 58 Abstract 60 This document describes the messages and procedures of the Negative- 61 ACKnowledgment (NACK) Oriented Reliable Multicast (NORM) Protocol. 62 This protocol can provide end-to-end reliable transport of bulk data 63 objects or streams over generic IP multicast routing and forwarding 64 services. NORM uses a selective, negative acknowledgment mechanism 65 for transport reliability and offers additional protocol mechanisms 66 to allow for operation with minimal a priori coordination among 67 senders and receivers. A congestion control scheme is specified to 68 allow the NORM protocol to fairly share available network bandwidth 69 with other transport protocols such as Transmission Control Protocol 70 (TCP). It is capable of operating with both reciprocal multicast 71 routing among senders and receivers and with asymmetric connectivity 72 (possibly a unicast return path) between the senders and receivers. 73 The protocol offers a number of features to allow different types of 74 applications or possibly other higher level transport protocols to 75 utilize its service in different ways. The protocol leverages the 76 use of FEC-based repair and other IETF Reliable Multicast Transport 77 (RMT) building blocks in its design. This document obsoletes RFC 78 3940. 80 Table of Contents 82 1. Introduction and Applicability . . . . . . . . . . . . . . . . 5 83 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 6 84 1.2. NORM Data Delivery Service Model . . . . . . . . . . . . . 6 85 1.3. NORM Scalability . . . . . . . . . . . . . . . . . . . . . 8 86 1.4. Environmental Requirements and Considerations . . . . . . 9 87 2. Architecture Definition . . . . . . . . . . . . . . . . . . . 9 88 2.1. Protocol Operation Overview . . . . . . . . . . . . . . . 11 89 2.2. Protocol Building Blocks . . . . . . . . . . . . . . . . . 13 90 2.3. Design Tradeoffs . . . . . . . . . . . . . . . . . . . . . 13 91 3. Conformance Statement . . . . . . . . . . . . . . . . . . . . 14 92 4. Message Formats . . . . . . . . . . . . . . . . . . . . . . . 16 93 4.1. NORM Common Message Header and Extensions . . . . . . . . 16 94 4.2. Sender Messages . . . . . . . . . . . . . . . . . . . . . 19 95 4.2.1. NORM_DATA Message . . . . . . . . . . . . . . . . . . 19 96 4.2.2. NORM_INFO Message . . . . . . . . . . . . . . . . . . 29 97 4.2.3. NORM_CMD Messages . . . . . . . . . . . . . . . . . . 30 98 4.3. Receiver Messages . . . . . . . . . . . . . . . . . . . . 48 99 4.3.1. NORM_NACK Message . . . . . . . . . . . . . . . . . . 48 100 4.3.2. NORM_ACK Message . . . . . . . . . . . . . . . . . . . 54 101 4.4. General Purpose Messages . . . . . . . . . . . . . . . . . 56 102 4.4.1. NORM_REPORT Message . . . . . . . . . . . . . . . . . 56 103 5. Detailed Protocol Operation . . . . . . . . . . . . . . . . . 56 104 5.1. Sender Initialization and Transmission . . . . . . . . . . 58 105 5.1.1. Object Segmentation Algorithm . . . . . . . . . . . . 59 106 5.2. Receiver Initialization and Reception . . . . . . . . . . 60 107 5.3. Receiver NACK Procedure . . . . . . . . . . . . . . . . . 61 108 5.4. Sender NACK Processing and Response . . . . . . . . . . . 63 109 5.4.1. Sender Repair State Aggregation . . . . . . . . . . . 63 110 5.4.2. Sender FEC Repair Transmission Strategy . . . . . . . 64 111 5.4.3. Sender NORM_CMD(SQUELCH) Generation . . . . . . . . . 65 112 5.4.4. Sender NORM_CMD(REPAIR_ADV) Generation . . . . . . . . 66 113 5.5. Additional Protocol Mechanisms . . . . . . . . . . . . . . 66 114 5.5.1. Group Round-trip Time (GRTT) Collection . . . . . . . 66 115 5.5.2. NORM Congestion Control Operation . . . . . . . . . . 68 116 5.5.3. NORM Positive Acknowledgment Procedure . . . . . . . . 76 117 5.5.4. Group Size Estimate . . . . . . . . . . . . . . . . . 78 118 6. Configurable Elements . . . . . . . . . . . . . . . . . . . . 78 119 7. Security Considerations . . . . . . . . . . . . . . . . . . . 81 120 7.1. Baseline Secure NORM Operation . . . . . . . . . . . . . . 83 121 7.1.1. IPsec Approach . . . . . . . . . . . . . . . . . . . . 83 122 7.1.2. IPsec Requirements . . . . . . . . . . . . . . . . . . 86 123 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 87 124 8.1. Explicit IANA Assignment Guidelines . . . . . . . . . . . 88 125 8.1.1. NORM Header Extension Types . . . . . . . . . . . . . 88 126 8.1.2. NORM Stream Control Codes . . . . . . . . . . . . . . 88 127 8.1.3. NORM_CMD Message Sub-types . . . . . . . . . . . . . . 89 129 9. Suggested Use . . . . . . . . . . . . . . . . . . . . . . . . 90 130 10. Changes from RFC3940 . . . . . . . . . . . . . . . . . . . . . 91 131 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 91 132 12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 92 133 12.1. Normative References . . . . . . . . . . . . . . . . . . . 92 134 12.2. Informative References . . . . . . . . . . . . . . . . . . 92 135 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 94 137 1. Introduction and Applicability 139 The Negative-acknowledgment (NACK) Oriented Reliable Multicast (NORM) 140 protocol can provide reliable transport of data from one or more 141 sender(s) to a group of receivers over an IP multicast network. The 142 primary design goals of NORM are to provide efficient, scalable, and 143 robust bulk data (e.g., computer files, transmission of persistent 144 data) transfer across possibly heterogeneous IP networks and 145 topologies. The NORM protocol design provides support for 146 distributed multicast session participation with minimal coordination 147 among senders and receivers. NORM allows senders and receivers to 148 dynamically join and leave multicast sessions at will with minimal 149 overhead for control information and timing synchronization among 150 participants. To accommodate this capability, NORM protocol message 151 headers contain some common information allowing receivers to easily 152 synchronize to senders throughout the lifetime of a reliable 153 multicast session. NORM is self-adapting to a wide range of dynamic 154 network conditions with little or no pre-configuration. The protocol 155 is tolerant of inaccurate timing estimations or lossy conditions that 156 can occur in many networks including mobile and wireless. The 157 protocol can also converge and maintain efficient operation even in 158 situations of heavy packet loss and large queuing or transmission 159 delays. This document obsoletes the Experimental RFC 3940 160 specification. 162 This document is a product of the IETF RMT working group and follows 163 the guidelines provided in the Author Guidelines for Reliable 164 Multicast Transport (RMT) Building Blocks and Protocol Instantiation 165 documents [RFC3269]. 167 Statement of Intent 169 This memo contains the definitions necessary to fully specify a 170 Reliable Multicast Transport protocol in accordance with the criteria 171 of IETF Criteria for Evaluating Reliable Multicast Transport and 172 Application Protocols [RFC2357]. The NORM specification described in 173 this document was previously published in the "Experimental Category" 174 [RFC3940]. It was the stated intent of the RMT working group to re- 175 submit this specifications as an IETF Proposed Standard in due 176 course. This Proposed Standard specification is thus based on RFC 177 3940 and has been updated according to accumulated experience and 178 growing protocol maturity since the publication of RFC 3940. Said 179 experience applies both to this specification itself and to 180 congestion control strategies related to the use of this 181 specification. The differences between RFC 3940 and this document 182 are listed in Section 10. 184 1.1. Requirements Language 186 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 187 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 188 document are to be interpreted as described in RFC 2119 [RFC2119]. 190 1.2. NORM Data Delivery Service Model 192 A NORM protocol instance (NormSession) is defined within the context 193 of participants communicating connectionless (e.g., Internet Protocol 194 (IP) or User Datagram Protocol (UDP)) packets over a network using 195 pre-determined addresses and host port numbers. Generally, the 196 participants exchange packets using an IP multicast group address, 197 but unicast transport MAY also be established or applied as an 198 adjunct to multicast delivery. In the case of multicast, the 199 participating NormNodes will communicate using a common IP multicast 200 group address and port number chosen via means outside the context of 201 the given NormSession. Other existing IETF data format and protocol 202 standards MAY be applied to describe and convey the necessary a 203 priori information for a specific NormSession (e.g., Session 204 Description Protocol (SDP) [RFC4566], Session Announcement Protocol 205 (SAP) [RFC2974], etc.). 207 The NORM protocol design is principally driven by the assumption of a 208 single sender transmitting bulk data content to a group of receivers. 209 However, the protocol MAY operate with multiple senders within the 210 context of a single NormSession. In initial implementations of this 211 protocol, it is anticipated multiple senders will transmit 212 independent of one another and receivers will maintain state as 213 necessary for each sender. In future versions of NORM, it is 214 possible some aspects of protocol operation (e.g., round-trip time 215 collection) will provide for alternate modes allowing more efficient 216 performance for applications requiring multiple senders. 218 NORM provides for three types of bulk data content objects 219 (NormObjects) to be reliably transported. These types include: 221 1. static computer memory data content ("NORM_OBJECT_DATA" type), 223 2. computer storage files ("NORM_OBJECT_FILE" type), and 225 3. non-finite streams of continuous data content 226 ("NORM_OBJECT_STREAM" type). 228 The distinction between "NORM_OBJECT_DATA" and "NORM_OBJECT_FILE" is 229 simply to provide a hint to receivers in NormSessions serving 230 multiple types of content as to what type of storage to allocate for 231 received content (i.e., memory or file storage). Other than that 232 distinction, the two are identical, providing for reliable transport 233 of finite (but potentially very large) units of content. These 234 static data and file services are anticipated to be useful for 235 multicast-based cache applications with the ability to reliably 236 provide transmission of large quantities of static data. Other types 237 of static data/file delivery services might make use of these 238 transport object types, too. The use of the "NORM_OBJECT_STREAM" 239 type is at the application's discretion and could be used to carry 240 static data or file content also. The NORM reliable stream service 241 opens up additional possibilities such as serialized reliable 242 messaging or other unbounded, perhaps dynamically produced content. 243 The "NORM_OBJECT_STREAM" provides for reliable transport analogous to 244 that of the Transmission Control Protocol (TCP), although NORM 245 receivers will be able to begin receiving stream content at any point 246 in time. The applicability of this feature will depend upon the 247 application. 249 The NORM protocol also allows for a small amount of out-of-band data 250 (sent as "NORM_INFO" messages) to be attached to the data content 251 objects transmitted by the sender. This readily-available out-of- 252 band data allows multicast receivers to quickly and efficiently 253 determine the nature of the corresponding data, file, or stream bulk 254 content being transmitted. This allows application-level control of 255 the receiver node's participation in the current transport activity. 256 This also allows the protocol to be flexible with minimal pre- 257 coordination among senders and receivers. The "NORM_INFO" content is 258 atomic in that its size MUST fit into the payload portion of a single 259 NORM message. 261 NORM does NOT provide for global or application-level identification 262 of data content within in its message headers. Note the "NORM_INFO" 263 out-of-band data mechanism can be leveraged by the application for 264 this purpose if desired, or identification can alternatively be 265 embedded within the data content. NORM does identify transmitted 266 content (NormObjects) with transport identifiers that are applicable 267 only while the sender is transmitting and/or repairing the given 268 object. These transport data content identifiers (NormTransportIds) 269 are assigned in a monotonically increasing fashion by each NORM 270 sender during the course of a NormSession. Participants, including 271 senders, in NORM protocol sessions are also identified with unique 272 identifiers (NormNodeIds). Each sender maintains its NormTransportId 273 assignments independently and thus individual NormObjects can be 274 uniquely identified during transport by concatenation of the session- 275 unique sender identifier (NormNodeId) and the assigned 276 NormTransportId. The NormTransportIds are assigned from a large, but 277 fixed, numeric space in increasing order and will be reassigned 278 during long-lived sessions. The NORM protocol provides mechanisms so 279 the sender application can terminate transmission of data content and 280 inform the group of this in an efficient manner. Other similar 281 protocol control mechanisms (e.g., session termination, receiver 282 synchronization, etc.) are specified so reliable multicast 283 application variants can realize different, complete bulk transfer 284 communication models to meet their goals. 286 To summarize, the NORM protocol provides reliable transport of 287 different types of data content (including potentially mixed types). 288 The senders enqueue and transmit bulk content in the form of static 289 data or files and/or non-finite, ongoing stream types. NORM senders 290 provide for repair transmission of data and/or FEC content in 291 response to NACK messages received from the receiver group. 292 Mechanisms for out-of-band information and other transport control 293 mechanisms are specified for use by applications to form complete 294 reliable multicast solutions for different purposes. 296 1.3. NORM Scalability 298 Group communication scalability requirements lead to adaptation of 299 negative acknowledgment (NACK) based protocol schemes when feedback 300 for reliability is needed [RmComparison]. NORM is a protocol 301 centered around the use of selective NACKs to request repairs of 302 missing data. NORM provides for the use of packet-level forward 303 error correction (FEC) techniques for efficient multicast repair and 304 OPTIONAL proactive transmission robustness [RFC3453]. FEC-based 305 repair can be used to greatly reduce the quantity of reliable 306 multicast repair requests and repair transmissions [MdpToolkit] in a 307 NACK-oriented protocol. The principal factor in NORM scalability is 308 the volume of feedback traffic generated by the receiver set to 309 facilitate reliability and congestion control. NORM uses 310 probabilistic suppression of redundant feedback based on 311 exponentially distributed random backoff timers. The performance of 312 this type of suppression relative to other techniques is described in 313 [McastFeedback]. NORM dynamically measures the group's round-trip 314 timing status to set its suppression and other protocol timers. This 315 allows NORM to scale well while maintaining reliable data delivery 316 transport with low latency relative to the network topology over 317 which it is operating. 319 Feedback messages can be either multicast to the group at large or 320 sent via unicast routing to the sender. In the case of unicast 321 feedback, the sender relays the feedback state to the group to 322 facilitate feedback suppression. In typical Internet environments, 323 the NORM protocol will readily scale to group sizes on the order of 324 tens of thousands of receivers. A study of the quantity of feedback 325 for this type of protocol is described in [NormFeedback]. NORM is 326 able to operate with a smaller amount of feedback than a single TCP 327 connection, even with relatively large numbers of receivers. Thus, 328 depending upon the network topology, it is possible for NORM to scale 329 to larger group sizes. With respect to computer resource usage, the 330 NORM protocol does not need state to be kept on all receivers in the 331 group. NORM senders maintain state only for receivers providing 332 explicit congestion control feedback. However, NORM receivers need 333 to maintain state for each active sender. This can constrain the 334 number of simultaneous senders in some uses of NORM. 336 1.4. Environmental Requirements and Considerations 338 All of the environmental requirements and considerations that apply 339 to the Multicast NACK Building Block [RFC5401], FEC Building Block 340 [RFC5052], and TCP-Friendly Multicast Congestion Control (TFMCC) 341 Building Block [RFC4654] also apply to the NORM protocol. 343 The NORM protocol SHALL be capable of operating in an end-to-end 344 fashion with no assistance from intermediate systems beyond basic IP 345 multicast group management, routing, and forwarding services. While 346 the techniques utilized in NORM are principally applicable to flat, 347 end-to-end IP multicast topologies, they could also be applied in the 348 sub-levels of hierarchical (e.g., tree-based) multicast distribution 349 if so desired. NORM can make use of reciprocal (among senders and 350 receivers) multicast communication under the Any-Source Multicast 351 (ASM) model defined in Host Extensions for IP Multicasting [RFC1112], 352 but SHALL also be capable of scalable operation in asymmetric 353 topologies such as Source-Specific Multicast (SSM) [RFC4607] where 354 only unicast routing service is available from the receivers to the 355 sender(s). 357 NORM is compatible with IPv4 and IPv6. Additionally, NORM can be 358 used with networks employing Network Address Translation (NAT) 359 providing the NAT device supports IP multicast and/or can cache UDP 360 traffic source port numbers for remapping feedback traffic from 361 receivers to the sender(s). 363 2. Architecture Definition 365 A NormSession is comprised of participants (NormNodes) acting as 366 senders and/or receivers. NORM senders transmit data content in the 367 form of NormObjects to the session destination address and the NORM 368 receivers attempt to reliably receive the transmitted content using 369 negative acknowledgments to request repair. Each NormNode within a 370 NormSession is assumed to have a preselected unique 32-bit identifier 371 (NormNodeId). NormNodes MUST have uniquely assigned identifiers 372 within a single NormSession to distinguish between possible multiple 373 senders and to distinguish feedback information from different 374 receivers. There are two reserved NormNodeId values. A value of 375 "0x00000000" is considered an invalid NormNodeId ("NORM_NODE_NONE") 376 and a value of "0xffffffff" is a "wild card" NormNodeId 377 ("NORM_NODE_ANY"). While the protocol does not preclude multiple 378 sender nodes concurrently transmitting within the context of a single 379 NORM session (i.e., many- to-many operation), any type of interactive 380 coordination among NORM senders is assumed to be controlled by the 381 application or higher protocol layer. There are some OPTIONAL 382 mechanisms specified in this document that can be leveraged for such 383 application layer coordination. 385 As previously noted, NORM allows for reliable transmission of three 386 different basic types of data content. The first type is 387 "NORM_OBJECT_DATA", that is used for static, persistent blocks of 388 data content maintained in the sender's application memory storage. 389 The second type is "NORM_OBJECT_FILE", that corresponds to data 390 stored in the sender's non-volatile file system. The 391 "NORM_OBJECT_DATA" and "NORM_OBJECT_FILE" types both represent 392 NormObjects of finite but potentially very large size. The third 393 type of data content is "NORM_OBJECT_STREAM", that corresponds to an 394 ongoing transmission of undefined length. This is analogous to the 395 reliable stream service provide by TCP for unicast data transport. 396 The format of the stream content is application-defined and can be 397 "byte" or "message" oriented. The NORM protocol provides for 398 "flushing" of the stream to expedite delivery or possibly enforce 399 application message boundaries. NORM protocol implementations MAY 400 offer either (or both) in-order delivery of the stream data to the 401 receive application or out-of-order (more immediate) delivery of 402 received segments of the stream to the receiver application. In 403 either case, NORM sender and receiver implementations provide 404 buffering to facilitate repair of the stream as it is transported. 406 All NormObjects are logically segmented into FEC coding blocks and 407 symbols for transmission by the sender. In NORM, an FEC encoding 408 symbol directly corresponds to the payload of "NORM_DATA" messages or 409 "segment". Note that when systematic FEC codes are used, the payload 410 of "NORM_DATA" messages sent for the first portion of a FEC encoding 411 block are source symbols (actual segments of original user data), 412 while the remaining symbols for the block consist of parity symbols 413 generated by FEC encoding. These parity symbols are generally sent 414 in response to repair requests, but some number MAY be sent 415 proactively at the end each encoding block to increase the robustness 416 of transmission. When non-systematic FEC codes are used, all symbols 417 sent consist of FEC encoding parity content. In this case, the 418 receiver needs to receive a sufficient number of symbols to 419 reconstruct (via FEC decoding) the original user data for the given 420 block. 422 Transmitted NormObjects are temporarily yet uniquely identified 423 within the NormSession context using the given sender's NormNodeId, 424 NormInstanceId, and a temporary NormTransportId. Depending upon the 425 implementation, individual NORM senders can manage their 426 NormInstanceIds independently, or a common NormInstanceId could be 427 agreed upon for all participating nodes within a session if needed as 428 a session identifier. NORM NormTransportId data content identifiers 429 are sender-assigned and applicable and valid only during a 430 NormObject's actual transport (i.e., for as long as the sender is 431 transmitting and providing repair of the indicated NormObject). For 432 a long-lived session, the NormTransportId field can wrap and 433 previously-used identifiers will be re-used. Note that globally 434 unique identification of transported data content is not provided by 435 NORM and, if necessary, is expected to be managed by the NORM 436 application. The individual segments or symbols of the NormObject 437 are further identified with FEC payload identifiers that include 438 coding block and symbol identifiers. These are discussed in detail 439 later in this document. 441 2.1. Protocol Operation Overview 443 A NORM sender primarily generates messages of type "NORM_DATA". 444 These messages carry original data segments or FEC symbols and repair 445 segments/symbols for the bulk data/file or stream NormObjects being 446 transferred. By default, redundant FEC symbols are sent only in 447 response to receiver repair requests (NACKs) and thus normally little 448 or no additional transmission overhead is imposed due to FEC 449 encoding. However, the NORM implementation MAY be configured to 450 proactively transmit some amount of redundant FEC symbols along with 451 the original content to potentially enhance performance (e.g., 452 improved delay) at the cost of additional transmission overhead. 453 This configuration is sensible for certain network conditions and can 454 allow for robust, asymmetric multicast (e.g., unidirectional routing, 455 satellite, cable) [FecHybrid] with reduced receiver feedback, or, in 456 some cases, no feedback. 458 A sender message of type "NORM_INFO" is also defined and is used to 459 carry OPTIONAL out-of-band context information for a given transport 460 object. A single "NORM_INFO" message can be associated with a 461 NormObject. Because of its atomic nature, missing "NORM_INFO" 462 messages can be NACKed and repaired with a slightly lower delay 463 process than NORM's general FEC-encoded data content. The 464 "NORM_INFO" message can serve special purposes for some bulk 465 transfer, reliable multicast applications where receivers join the 466 group mid-stream and need to ascertain contextual information on the 467 current content being transmitted. The NACK process for "NORM_INFO" 468 will be described later. When the "NORM_INFO" message type is used, 469 its transmission SHOULD precede transmission of any "NORM_DATA" 470 message for the associated NormObject. 472 The sender also generates messages of type "NORM_CMD" to assist in 473 certain protocol operations such as congestion control, end-of- 474 transmission flushing, group round trip time (GRTT) estimation, 475 receiver synchronization, and OPTIONAL positive acknowledgment 476 requests or application defined commands. The transmission of 477 "NORM_CMD" messages from the sender is accomplished by one of three 478 different procedures. These procedures are: single, best effort 479 unreliable transmission of the command; repeated redundant 480 transmissions of the command; and positively-acknowledged commands. 481 The transmission technique used for a given command depends upon the 482 function of the command. Several core commands are defined for basic 483 protocol operation. Additionally, implementations MAY wish to 484 consider providing the OPTIONAL application-defined commands that can 485 take advantage of the transmission methodologies available for 486 commands. This allows for application-level session management 487 mechanisms that can make use of information available to the 488 underlying NORM protocol engine (e.g., round-trip timing, 489 transmission rate, etc.). A notable distinction between "NORM_DATA" 490 message and some "NORM_CMD" message transmissions is that typically a 491 receiver will need to allocate resources to manage reliable reception 492 when "NORM_DATA" messages are received. However some "NORM_CMD" 493 messages are completely atomic and no specific reliability 494 (buffering) state needs to be kept. Thus, for session management or 495 other purposes it is possible that even participants acting 496 principally as data receivers MAY transmit "NORM_CMD" messages. 497 However, it is RECOMMENDED that this is not done within the context 498 of the NORM multicast session unless congestion control is addressed. 499 For example, many receiver nodes transmitting "NORM_CMD" messages 500 simultaneously can cause congestion for the destination(s). 502 All sender transmissions are subject to rate control governed by a 503 peak transmission rate set for each participant by the application. 504 This can be used to limit the quantity of multicast data transmitted 505 by the group. When NORM's congestion control algorithm is enabled 506 the rate for senders is automatically adjusted. In some networks, it 507 is desirable to establish minimum and maximum bounds for the rate 508 adjustment depending upon the application even when dynamic 509 congestion control is enabled. However, in the case of the general 510 Internet, congestion control policy SHALL be observed that is 511 compatible with coexistent TCP flows. 513 NORM receivers generate messages of type "NORM_NACK" or "NORM_ACK" in 514 response to transmissions of data and commands from a sender. The 515 "NORM_NACK" messages are generated to request repair of detected data 516 transmission losses. Receivers generally detect losses by tracking 517 the sequence of transmission from a sender. Sequencing information 518 is embedded in the transmitted data packets and end-of-transmission 519 commands from the sender. "NORM_ACK" messages are generated in 520 response to certain commands transmitted by the sender. In the 521 general (and most scalable) protocol mode, "NORM_ACK" messages are 522 sent only in response to congestion control commands from the sender. 523 The feedback volume of these congestion control "NORM_ACK" messages 524 is controlled using the same timer-based probabilistic suppression 525 techniques as for "NORM_NACK" messages to avoid feedback implosion. 526 In order to meet potential application requirements for positive 527 acknowledgment from receivers, other "NORM_ACK" messages are defined 528 and available for use. 530 2.2. Protocol Building Blocks 532 The operation of the NORM protocol is based primarily upon the 533 concepts presented in the Multicast NACK Building Block [RFC5401] 534 document. This includes the basic NORM architecture and the data 535 transmission, repair, and feedback strategies discussed in that 536 document. The reliable multicast building block approach, as 537 described in Reliable Multicast Transport Building Blocks for One-to- 538 Many Bulk-Data Transfer [RFC3048], is applied in creating the full 539 NORM protocol instantiation. NORM also makes use of the parity-based 540 encoding techniques for repair messaging and added transmission 541 robustness as described in The Use of Forward Error Correction (FEC) 542 in Reliable Multicast [RFC3453]. NORM uses the FEC Payload ID as 543 specified by the FEC Building Block document [RFC5052]. 544 Additionally, for congestion control, this document fully specifies a 545 baseline congestion control mechanism (NORM-CC) based on the TCP- 546 Friendly Multicast Congestion Control (TFMCC) scheme[TfmccPaper], 547 [RFC4654]. 549 2.3. Design Tradeoffs 551 While the various features of NORM provide some measure of general 552 purpose utility, it is important to emphasize the understanding that 553 "no one size fits all" in the reliable multicast transport arena. 554 There are numerous engineering trade-offs involved in reliable 555 multicast transport design and this necessitates an increased 556 awareness of application and network architecture considerations. 557 Performance requirements affecting design can include: group size, 558 heterogeneity (e.g., capacity and/or delay), asymmetric delivery, 559 data ordering, delivery delay, group dynamics, mobility, congestion 560 control, and transport across low capacity connections. NORM 561 contains various parameters to accommodate many of these differing 562 requirements. The NORM protocol and its mechanisms MAY be applied in 563 multicast applications outside of bulk data transfer, but there is an 564 assumed model of bulk transfer transport service that drives the 565 trade-offs that determine the scalability and performance described 566 in this document. 568 The ability of NORM to provide reliable data delivery is also 569 governed by any buffer constraints of the sender and receiver 570 applications. NORM protocol implementations SHOULD operate with the 571 greatest efficiency and robustness possible within application- 572 defined buffer constraints. Buffer requirements for reliability, as 573 always, are a function of the delay-bandwidth product of the network 574 topology. NORM performs best when allowed more buffering resources 575 than typical point-to-point transport protocols. This is because 576 NORM feedback suppression is based upon randomly-delayed 577 transmissions from the receiver set, rather than immediately 578 transmitted feedback. There are definitive trade-offs between buffer 579 utilization, group size scalability, and efficiency of performance. 580 Large buffer sizes allow the NORM protocol to perform most 581 efficiently in large delay-bandwidth topologies and allow for longer 582 feedback suppression backoff timeouts. This yields improved group 583 size scalability. NORM can operate with reduced buffering but at a 584 cost of decreased efficiency (lower relative goodput) and reduced 585 group size scalability. 587 3. Conformance Statement 589 This RMT Protocol Instantiation document, in conjunction with the 590 Multicast Negative-Acknowledgment (NACK) [RFC5401] and Forward Error 591 Correction (FEC) [RFC5052] Building Blocks, completely specifies a 592 working reliable multicast transport protocol that conforms to the 593 requirements described in RFC 2357. 595 This document specifies the following message types and mechanisms 596 that are REQUIRED in complying NORM protocol implementations: 598 +------------------------+------------------------------------------+ 599 | Message Type | Purpose | 600 +------------------------+------------------------------------------+ 601 | "NORM_DATA" | Sender message for application data | 602 | | transmission. Implementations MUST | 603 | | support at least one of the | 604 | | "NORM_OBJECT_DATA", "NORM_OBJECT_FILE", | 605 | | or "NORM_OBJECT_STREAM" delivery | 606 | | services. The use of the NORM FEC Object | 607 | | Transmission Information header | 608 | | extension is OPTIONAL with "NORM_DATA" | 609 | | messages. | 610 | "NORM_CMD(FLUSH)" | Sender command to excite receivers for | 611 | | repair requests in lieu of ongoing | 612 | | "NORM_DATA" transmissions. Note the use | 613 | | of the "NORM_CMD(FLUSH)" for positive | 614 | | acknowledgment of data receipt is | 615 | | OPTIONAL. | 616 | "NORM_CMD(SQUELCH)" | Sender command to advertise its current | 617 | | valid repair window in response to | 618 | | invalid requests for repair. | 619 | "NORM_CMD(REPAIR_ADV)" | Sender command to advertise current | 620 | | repair (and congestion control state) to | 621 | | group when unicast feedback messages are | 622 | | detected. Used to control/suppress | 623 | | excessive receiver feedback in | 624 | | asymmetric multicast topologies. | 625 | "NORM_CMD(CC)" | Sender command used in collection of | 626 | | round trip timing and congestion control | 627 | | status from group (this is OPTIONAL if | 628 | | alternative congestion control mechanism | 629 | | and round trip timing collection is | 630 | | used). | 631 | "NORM_NACK" | Receiver message used to request repair | 632 | | of missing transmitted content. | 633 | "NORM_ACK" | Receiver message used to proactively | 634 | | provide feedback for congestion control | 635 | | purposes. Also used with the OPTIONAL | 636 | | NORM Positive Acknowledgment Process. | 637 +------------------------+------------------------------------------+ 639 This document also describes the following message types and 640 associated mechanisms that are OPTIONAL for complying NORM protocol 641 implementations: 643 +-------------------------+-----------------------------------------+ 644 | Message Type | Purpose | 645 +-------------------------+-----------------------------------------+ 646 | "NORM_INFO" | Sender message for providing ancillary | 647 | | context information associated with | 648 | | NORM transport objects. The use of the | 649 | | NORM FEC Object Transmission | 650 | | Information header extension is | 651 | | OPTIONAL with "NORM_INFO" messages. | 652 | "NORM_CMD(EOT)" | Sender command to indicate it has | 653 | | reached end-of-transmission and will no | 654 | | longer respond to repair requests. | 655 | "NORM_CMD(ACK_REQ)" | Sender command to support | 656 | | application-defined, positively | 657 | | acknowledged commands sent outside of | 658 | | the context of the bulk data content | 659 | | being transmitted. The NORM Positive | 660 | | Acknowledgment Procedure associated | 661 | | with this message type is OPTIONAL. | 662 | "NORM_CMD(APPLICATION)" | Sender command containing | 663 | | application-defined commands sent | 664 | | outside of the context of the bulk data | 665 | | content being transmitted. | 666 | "NORM_REPORT" | Optional message type reserved for | 667 | | experimental implementations of the | 668 | | NORM protocol. | 669 +-------------------------+-----------------------------------------+ 671 4. Message Formats 673 There are two primary classes of NORM messages (see Section 2.1): 674 sender messages and receiver messages. "NORM_CMD", "NORM_INFO", and 675 "NORM_DATA" message types are generated by senders of data content, 676 and "NORM_NACK" and "NORM_ACK" messages generated by receivers within 677 a NormSession. Sender messages SHALL be governed by congestion 678 control for Internet use. For session management or other purposes, 679 receivers can also employ "NORM_CMD" message transmissions. The 680 principal rationale for distinguishing sender and receiver messages 681 is that receivers will typically need to allocate resources to 682 support reliable reception from sender(s) and NORM sender messages 683 are subject to congestion control. NORM receivers MAY employ the 684 "NORM_CMD" message type for application-defined purposes but it is 685 RECOMMENDED that congestion control and feedback implosion issues be 686 addressed. Additionally, an auxiliary message type of "NORM_REPORT" 687 is also provided for experimental purposes. This section describes 688 the message formats used by the NORM protocol. These messages and 689 their fields are referenced in the detailed functional description of 690 the NORM protocol given in Section 5. Individual NORM messages are 691 compatible with the Maximum Transmission Unit (MTU) limitations of 692 encapsulating Internet protocols including IPv4, IPv6, and UDP. The 693 current NORM protocol specification assumes UDP encapsulation and 694 leverages the transport features of UDP. The NORM messages are 695 independent of network addresses and can be used in IPv4 and IPv6 696 networks. 698 4.1. NORM Common Message Header and Extensions 700 There are some common message fields contained in all NORM message 701 types. Additionally, a header extension mechanism is defined to 702 expand the functionality of the NORM protocol without revision to 703 this document. All NORM protocol messages begin with a common header 704 with information fields as follows: 705 0 1 2 3 706 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 707 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 708 |version| type | hdr_len | sequence | 709 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 710 | source_id | 711 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 713 NORM Common Message Header Format 715 The "version" field is a 4-bit value indicating the protocol version 716 number. NORM implementations SHOULD ignore received messages with 717 version numbers different from their own. This number is intended to 718 indicate and distinguish upgrades of the protocol that are non- 719 interoperable. The NORM version number for this specification is 1. 721 The message "type" field is a 4-bit value indicating the NORM 722 protocol message type. These types are defined as follows: 724 +------------------+------------------+ 725 | Message | Value | 726 +------------------+------------------+ 727 | "NORM_INFO" | 1 | 728 | "NORM_DATA" | 2 | 729 | "NORM_CMD" | 3 | 730 | "NORM_NACK" | 4 | 731 | "NORM_ACK" | 5 | 732 | "NORM_REPORT" | 6 | 733 +------------------+------------------+ 735 The 8-bit "hdr_len" field indicates the number of 32-bit words that 736 comprise the given message's header portion. This is used to 737 facilitate addition of header extensions. The presence of header 738 extensions are implied when the "hdr_len" value is greater than the 739 base value for the given message "type". 741 The "sequence" field is a 16-bit value that is set by the message 742 originator. The "sequence" field serves two separate purposes, 743 depending upon the message type: 745 1. NORM senders MUST set the "sequence" field of sender messages 746 ("NORM_INFO", "NORM_DATA", and "NORM_CMD") so that receivers can 747 monitor the "sequence" value to maintain an estimate of packet 748 loss that can be used for congestion control purposes (See 749 Section 5.5.2 for a detailed description of NORM Congestion 750 Control operation). A monotonically-increasing sequence number 751 space MUST be maintained to mark NORM sender messages in this 752 way. Note that this "sequence" number is explicitly NOT used in 753 NORM as part of its reliability procedures. The NORM object and 754 FEC payload identifiers are used to detect missing content for 755 reliable transfer purposes. 757 2. NORM receivers SHOULD set the "sequence" field to support 758 protection from message replay attacks of "NORM_NACK" or 759 "NORM_NACK" messages. Note that, depending upon configuration, 760 NORM feedback messages are sent to the session multicast address 761 or the unicast address[es] of the active NORM sender[s]. Thus, a 762 separate, monotonically-increasing sequence number space MUST be 763 maintained for each destination address to which the NORM 764 receiver is transmitting feedback messages. 766 Note that these two separate purposes necessitate the maintenance of 767 separate sequence spaces to support the functions described here. 768 And, in the case of NORM receivers, additional sequence spaces are 769 needed when feedback messages are sent to the sender unicast 770 address[es] instead of the session address. 772 The "source_id" field is a 32-bit value that uniquely identifies the 773 node that sent the message within the context of a single 774 NormSession. This value is termed the NORM node identifier 775 (NormNodeId) and unique NormNodeId identifiers MUST be assigned 776 within a single NormSession. In some cases, use of the host IPv4 777 address or a hash of an address can suffice, but alternative 778 methodologies for assignment and potential collision resolution of 779 node identifiers within a multicast session SHOULD be considered. 780 For example, the techniques for managing the 32-bit "synchronization 781 source" (SSRC) identifiers defined in the Real-Time Protocol (RTP) 782 specification [RFC3550] are applicable for use with NORM node 783 identifiers when an ASM traffic model is observed. In most 784 deployments of the NORM protocol to date, the NormNodeId assignments 785 are administratively configured and this form of NormNodeId 786 assignment is RECOMMENDED for most purposes. NORM sender NormNodeId 787 values MUST be unique within an ASM session so that NORM receiver 788 feedback can be properly demultiplexed by senders and NORM receiver 789 NormNodeId values MUST be unique to for congestion control operation 790 and when the OPTIONAL positive acknowledgement mechanism is used. 792 NORM Header Extensions 794 When header extensions are applied, they follow the message type's 795 base header and precede any payload portion. There are two formats 796 for header extensions, both of which begin with an 8-bit "het" 797 (header extension type) field. One format is provided for variable- 798 length extensions with "het" values in the range from 0 through 127. 799 The other format is for fixed length (one 32-bit word) extensions 800 with "het" values in the range from 128 through 255. 802 For variable-length extensions, the value of the "hel" field is the 803 length of the entire header extension, expressed in multiples of 32- 804 bit words. The "hel" field MUST be present for variable-length 805 extensions ("het" between 0 and 127) and MUST NOT be present for 806 fixed-length extensions ("het" between 128 and 255). 808 The formats of the variable-length and fixed-length header extensions 809 are given, respectively, here: 810 0 1 2 3 811 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 812 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 813 | het <=127 | hel | | 814 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 815 | Header Extension Content | 816 | ... | 817 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 819 NORM Variable Length Header Extension Format 821 0 1 2 3 822 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 823 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 824 | het >=128 | reserved | Header Extension Content | 825 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 827 NORM Fixed Length (32-bit) Header Extension Format 829 The "Header Extension Content" portion of the header extension is 830 defined for each extension type. Some header extensions are defined 831 within this document for NORM baseline FEC and congestion control 832 operations. 834 4.2. Sender Messages 836 NORM sender messages include the "NORM_DATA" type, the "NORM_INFO" 837 type, and the "NORM_CMD" type. "NORM_DATA" and "NORM_INFO" messages 838 contain application data content while "NORM_CMD" messages are used 839 for various protocol control functions. 841 4.2.1. NORM_DATA Message 843 The "NORM_DATA" message is generally the predominant type transmitted 844 by NORM senders. These messages are used to encapsulate segmented 845 data content for objects of type "NORM_OBJECT_DATA", 846 "NORM_OBJECT_FILE", and "NORM_OBJECT_STREAM". "NORM_DATA" messages 847 contain original or FEC-encoded application data content. 849 The format of "NORM_DATA" messages is comprised of three logical 850 portions: 1) a fixed-format "NORM_DATA" header portion, 2) a FEC 851 Payload ID portion with a format dependent upon the FEC encoding 852 used, and 3) a payload portion containing source or encoded 853 application data content. Note for objects of type 854 "NORM_OBJECT_STREAM", the payload portion contains additional fields 855 used to appropriately recover stream content. NORM implementations 856 MAY also extend the "NORM_DATA" header to include a FEC Object 857 Transmission Information (EXT_FTI) header extension. This allows 858 NORM receivers to automatically allocate resources and properly 859 perform FEC decoding without the need for pre-configuration or out- 860 of-band information. 861 0 1 2 3 862 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 863 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 864 |version| type=2| hdr_len | sequence | 865 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 866 | source_id | 867 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 868 | instance_id | grtt |backoff| gsize | 869 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 870 | flags | fec_id | object_transport_id | 871 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 872 | fec_payload_id | 873 | ... | 874 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 875 | header_extensions (if applicable) | 876 | ... | 877 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 878 | payload_len* | payload_msg_start* | 879 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 880 | payload_offset* | 881 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 882 | payload_data* | 883 | ... | 884 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 886 NORM_DATA Message Format 888 *IMPORTANT NOTE: The "payload_len", "payload_msg_start" and 889 "payload_offset" fields are present only for objects of type 890 "NORM_OBJECT_STREAM". These fields, as with the entire payload, are 891 subject to any FEC encoding used. Thus, when systematic FEC codes 892 are used, these values can be directly interpreted only for packets 893 containing source symbols while packets containing FEC parity content 894 need decoding before these fields can be interpreted. 896 The "version", "type", "hdr_len", "sequence", and "source_id" fields 897 form the NORM Common Message Header as described in Section 4.1. The 898 value of the "NORM_DATA" "type" field is 2. The "NORM_DATA" base 899 "hdr_len" value is 4 (i.e. 4 32-bit words) plus the size of the 900 "fec_payload_id" field. The "fec_payload_id" field size depends upon 901 the FEC encoding type referenced by the "fec_id" field. For example, 902 when small block, systematic codes are used, a "fec_id" value of 129 903 is indicated and the size of the "fec_payload_id" is two 32-bit 904 words. In this case the "NORM_DATA" base "hdr_len" value is 6. The 905 cumulative size of any header extensions applied is added into the 906 "hdr_len" field. 908 The "instance_id" field contains a value generated by the sender to 909 uniquely identify its current instance of participation in the 910 NormSession. This allows receivers to detect when senders have 911 perhaps left and rejoined a session in progress. When a sender 912 (identified by its "source_id") is detected to have a new 913 "instance_id", the NORM receivers SHOULD drop their previous state on 914 the sender and begin reception anew, or at least treat this 915 "instance" as a new, separate sender. 917 The "grtt" field contains a non-linear quantized representation of 918 the sender's current estimate of group round-trip time 919 ("GRTT_sender") (this is also referred to as "R_max" in 920 [TfmccPaper]). This value is used to control timing of the NACK 921 repair process and other aspects of protocol operation as described 922 in this document. Normally, the advertised "grtt" value will 923 correspond to what the sender has measured based on feedback from the 924 group, but, at low transmission rates, the advertised "grtt" SHALL be 925 set to "MAX(grttMeasured, NormSegmentSize/senderRate)" where the 926 "NormSegmentSize" is sender's segment size in bytes and the 927 "senderRate" is the sender's current transmission rate in bytes per 928 second. The algorithm for encoding and decoding this field is 929 described in the Multicast NACK Building Block [RFC5401]. 931 The "backoff" field value is used by receivers to determine the 932 maximum backoff timer value used in the timer-based NORM NACK 933 feedback suppression. This 4-bit field supports values from 0-15 934 that is multiplied by "GRTT_sender" to determine the maximum backoff 935 timeout. The "backoff" field informs the receivers of the sender's 936 backoff factor parameter ("K_sender"). Recommended values and their 937 use are described in the NORM receiver NACK procedure description in 938 Section 5.3. 940 The "gsize" field contains a representation of the sender's current 941 estimate of group size ("GSIZE_sender"). This 4-bit field can 942 roughly represent values from ten to 500 million where the most 943 significant bit value of 0 or 1 represents a mantissa of 1 or 5, 944 respectively and the three least significant bits incremented by one 945 represent a base 10 exponent (order of magnitude). For examples, a 946 field value of "0x0" represents 1.0e+01 (10), a value of "0x8" 947 represents 5.0e+01 (50), a value of "0x1" represents 1.0e+02 (100), 948 and a value of "0xf" represents 5.0e+08. For NORM feedback 949 suppression purposes, the group size does not need to be represented 950 with a high degree of precision. The group size MAY even be 951 estimated somewhat conservatively (i.e., overestimated) to maintain 952 low levels of feedback traffic. A default group size estimate of 953 10,000 ("gsize" = 0x3) is RECOMMENDED for general purpose reliable 954 multicast applications using the NORM protocol. 956 The "flags" field contains a number of different binary flags 957 providing information and hints for the receiver to appropriately 958 handle the identified object. Defined flags in this field include: 960 +------------------------+-------+----------------------------------+ 961 | Flag | Value | Purpose | 962 +------------------------+-------+----------------------------------+ 963 | "NORM_FLAG_REPAIR" | 0x01 | Indicates message is a repair | 964 | | | transmission | 965 | "NORM_FLAG_EXPLICIT" | 0x02 | Indicates a repair segment | 966 | | | intended to meet a specific | 967 | | | receiver erasure, as compared to | 968 | | | parity segments provided by the | 969 | | | sender for general purpose (with | 970 | | | respect to an FEC coding block) | 971 | | | erasure filling. | 972 | "NORM_FLAG_INFO" | 0x04 | Indicates availability of | 973 | | | "NORM_INFO" for object. | 974 | "NORM_FLAG_UNRELIABLE" | 0x08 | Indicates that repair | 975 | | | transmissions for the specified | 976 | | | object will be unavailable | 977 | | | (One-shot, best effort | 978 | | | transmission). | 979 | "NORM_FLAG_FILE" | 0x10 | Indicates object is file-based | 980 | | | data (hint to use disk storage | 981 | | | for reception). | 982 | "NORM_FLAG_STREAM" | 0x20 | Indicates object is of type | 983 | | | "NORM_OBJECT_STREAM". | 984 +------------------------+-------+----------------------------------+ 986 "NORM_FLAG_REPAIR" is set when the associated message is a repair 987 transmission. This information can be used by receivers to help 988 observe a join policy where it is desired that newly joining 989 receivers only begin participating in the NACK process upon receipt 990 of new (non-repair) data content. "NORM_FLAG_EXPLICIT" is used to 991 mark repair messages sent when the data sender has exhausted its 992 ability to provide "fresh" (not previously transmitted) parity 993 segments as repair. This flag could possibly be used by intermediate 994 systems implementing functionality to control sub-casting of repair 995 content to different legs of a reliable multicast topology with 996 disparate repair needs. "NORM_FLAG_INFO" is set only when OPTIONAL 997 "NORM_INFO" content is actually available for the associated object. 998 Thus, receivers will NACK for retransmission of "NORM_INFO" only when 999 it is available for a given object. "NORM_FLAG_UNRELIABLE" is set 1000 when the sender wishes to transmit an object with only "best effort" 1001 delivery and will not supply repair transmissions for the object. 1002 NORM receivers SHOULD NOT execute repair requests for objects marked 1003 with the "NORM_FLAG_UNRELIABLE" flag. There are cases where 1004 receivers can inadvertently request repair of such objects when all 1005 segments (or info content) for those objects are not received (i.e., 1006 a gap in the "object_transport_id" sequence is noted). In this case, 1007 the sender SHALL invoke the "NORM_CMD(SQUELCH)" process as described 1008 in Section 4.2.3. 1010 "NORM_FLAG_FILE" can be set as a hint from the sender that the 1011 associated object SHOULD be stored in non-volatile storage. 1012 "NORM_FLAG_STREAM" is set when the identified object is of type 1013 "NORM_OBJECT_STREAM". The presence of "NORM_FLAG_STREAM" overrides 1014 that of "NORM_FLAG_FILE" with respect to interpretation of object 1015 size and the format of "NORM_DATA" messages. 1017 The "fec_id" field corresponds to the FEC Encoding Identifier 1018 described in the FEC Building Block document [RFC5052]. The "fec_id" 1019 value implies the format of the "fec_payload_id" field and, coupled 1020 with FEC Object Transmission Information, the procedures to decode 1021 FEC encoded content. Small block, systematic codes ("fec_id" = 129) 1022 are expected to be used for most NORM purposes and systematic FEC 1023 codes are RECOMMENDED for most efficient performance of 1024 "NORM_OBJECT_STREAM" transport. 1026 The "object_transport_id" field is a monotonically and incrementally 1027 increasing value assigned by the sender to NormObjects being 1028 transmitted. Transmissions and repair requests related to that 1029 object use the same "object_transport_id" value. For sessions of 1030 very long or indefinite duration, the "object_transport_id" field 1031 will wrap and be repeated, but it is presumed that the 16-bit field 1032 size provides a sufficient sequence space to avoid object confusion 1033 amongst receivers and sources (i.e., receivers SHOULD re-synchronize 1034 with a server when receiving object sequence identifiers sufficiently 1035 out-of-range with the current state kept for a given source). During 1036 the course of its transmission within a NORM session, an object is 1037 uniquely identified by the concatenation of the sender "source_id" 1038 and the given "object_transport_id". Note that "NORM_INFO" messages 1039 associated with the identified object carry the same 1040 "object_transport_id" value. 1042 The "fec_payload_id" identifies the attached "NORM_DATA" "payload" 1043 content. The size and format of the "fec_payload_id" field depends 1044 upon the FEC type indicated by the "fec_id" field. These formats are 1045 given in the descriptions of specific FEC schemes such as those 1046 described in the FEC Basic Schemes [RFC5445] specification or in 1047 other FEC Schemes. As an example, the format of the "fec_payload_id" 1048 format for Small Block, Systematic codes ("fec_id" = 129) from theFEC 1049 Basic Schemes [RFC5445] specification is given here: 1050 0 1 2 3 1051 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1052 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1053 | source_block_number | 1054 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1055 | source_block_len | encoding_symbol_id | 1056 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1058 Example: FEC Payload Id Format for 'fec_id' = 129 1060 In this example FEC payload identifier, the "source_block_number", 1061 "source_block_len", and "encoding_symbol_id" fields correspond to the 1062 "Source Block Number", "Source Block Length, and "Encoding Symbol ID" 1063 fields of the FEC Payload ID format for Small Block Systematic FEC 1064 Schemes identified by a "fec_id" value of 129 as specified by the FEC 1065 Basic Schemes [RFC5445] specification. The "source_block_number" 1066 identifies the coding block's relative position with a NormObject. 1067 Note that, for NormObjects of type "NORM_OBJECT_STREAM", the 1068 "source_block_number" will wrap for very long lived sessions. The 1069 "source_block_len" indicates the number of user data segments in the 1070 identified coding block. Given the "source_block_len" information of 1071 how many symbols of application data are contained in the block, the 1072 receiver can determine whether the attached segment is data or parity 1073 content and treat it appropriately. Applications MAY dynamically 1074 "shorten" code blocks when the pending information content is not 1075 predictable (e.g. real-time message streams). In that case, the 1076 "source_block_len" value given for an "encoding_symbol_id" that 1077 contains FEC parity content SHALL take precedence over the 1078 "source_block_len" value provided for any packets containing source 1079 symbols. Also, the "source_block_len" value given for an ordinally 1080 higher "encoding_symbol_id" SHALL take precedence over the 1081 "source_block_len" given for prior encoding symbols. The reason for 1082 this is that the sender will only know the maximum source block 1083 length at the time is transmitting source symbols, but then 1084 subsequently "shorten" the code and then provide that last source 1085 symbol and/or encoding symbols with FEC parity content. The 1086 "encoding_symbol_id" identifies which specific symbol (segment) 1087 within the coding block the attached payload conveys. Depending upon 1088 the value of the "encoding_symbol_id" and the associated 1089 "source_block_len" parameters for the block, the symbol (segment) 1090 referenced will be a user data or an FEC parity segment. For 1091 systematic codes, encoding symbols numbered less than the 1092 "source_block_len" contain original application data while segments 1093 greater than or equal to "source_block_len" contain parity symbols 1094 calculated for the block. The concatenation of 1095 "object_transport_id::fec_payload_id" can be viewed as a unique 1096 transport protocol data unit identifier for the attached segment with 1097 respect to the NORM sender's instance within a session. 1099 Additional FEC Object Transmission Information (FTI) (as described in 1100 the FEC Building Block [RFC5052]) is needed to properly receive and 1101 decode NORM transport objects. This information MAY be provided as 1102 out-of-band session information. In some cases, it will be useful 1103 for the sender to include this information "in-band" to facilitate 1104 receiver operation with minimal pre-configuration. For this purpose, 1105 the NORM FEC Object Transmission Information Header Extension 1106 (EXT_FTI) is defined. This header extension MAY be applied to 1107 "NORM_DATA" and "NORM_INFO" messages to provide this necessary 1108 information. The format of the EXT_FTI consists of two parts, a 1109 general part that contains the size of the associated transport 1110 object and a portion that depends upon the FEC scheme being used. 1111 The "fec_id" field in "NORM_DATA" and "NORM_INFO" messages identifies 1112 the FEC scheme. The format of the EXT_FTI general part is given 1113 here. 1115 0 1 2 3 1116 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1117 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1118 | het = 64 | hel = 4 | object_size (msb) | 1119 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1120 | object_size (lsb) | 1121 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1122 | FEC Scheme specific content ... | 1124 EXT_FTI Header Extension General Portion Format 1126 The header extension type "het" field value for the EXT_FTI header 1127 extension is 64. The header extension length "hel" value depends 1128 upon the format of the FTI for encoding type identified by the 1129 "fec_id" field. 1131 The 48-bit "object_size" field indicates the total length of the 1132 object (in bytes) for the static object types of "NORM_OBJECT_FILE" 1133 and "NORM_OBJECT_DATA". This information is used by receivers to 1134 determine storage requirements and/or allocate storage for the 1135 received object. Receivers with insufficient storage capability 1136 might wish to forego reliable reception (i.e., not NACK for) of the 1137 indicated object. In the case of objects of type 1138 "NORM_OBJECT_STREAM", the "object_size" field is used by the sender 1139 to advertise the size of its stream buffer to the receiver group. In 1140 turn, the receivers SHOULD use this information to allocate a stream 1141 buffer for reception of corresponding size. 1143 As noted, the format of the extension depends upon the FEC code in 1144 use, but in general it contains any necessary details on the code in 1145 use (e.g., FEC Instance ID, etc.). As an example, the format of the 1146 EXT_FTI for small block systematic codes ("fec_id" = 129) is given 1147 here: 1148 0 1 2 3 1149 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1150 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1151 | het = 64 | hel = 4 | object_size (msb) | 1152 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1153 | object_size (lsb) | 1154 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1155 | fec_instance_id | segment_size | 1156 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1157 | fec_max_block_len | fec_num_parity | 1158 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1160 Example: EXT_FTI Header Extension Format for 'fec_id' = 129 1162 In this example (for "fec_id" = 129), the "hel" field value is 4. 1163 The size of the EXT_FTI header extension will possibly be different 1164 for other FEC schemes. 1166 The 48-bit "object_size" serves the purpose described previously. 1168 The "fec_instance_id" corresponds to the "FEC Instance ID" described 1169 in the FEC Building Block [RFC5052]. In this case, the 1170 "fec_instance_id" is a value corresponding to the particular type of 1171 Small Block Systematic Code being used (e.g., Reed-Solomon GF(2^8), 1172 Reed-Solomon GF(2^16), etc). The standardized assignment of FEC 1173 Instance ID values is described in RFC 5052. 1175 The "segment_size" field indicates the sender's current setting for 1176 maximum message payload content (in bytes). This allows receivers to 1177 allocate appropriate buffering resources and to determine other 1178 information in order to properly process received data messaging. 1179 Typically, FEC parity symbol segments will be of this size. 1181 The "fec_max_block_len" indicates the current maximum number of user 1182 data segments per FEC coding block to be used by the sender during 1183 the session. This allows receivers to allocate appropriate buffer 1184 space for buffering blocks transmitted by the sender. 1186 The "fec_num_parity" corresponds to the "maximum number of encoding 1187 symbols that can be generated for any source block" as described in 1188 for FEC Object Transmission Information for Small Block Systematic 1189 Codes in the FEC Building Block [RFC5052]. For example, Reed-Solomon 1190 codes can be arbitrarily shortened to create different code 1191 variations for a given block length. In the case of Reed-Solomon 1192 (GF(2^8) and GF(2^16)) codes, this value indicates the maximum number 1193 of parity segments available from the sender for the coding blocks. 1194 This field MAY be interpreted differently for other systematic codes 1195 as they are defined. 1197 The payload portion of "NORM_DATA" messages includes source data or 1198 FEC encoded application content. The content of this payload depends 1199 upon the FEC scheme being employed, and support for streaming using 1200 the "NORM_OBJECT_STREAM" type, when applicable, necessitates some 1201 additional content in the payload. 1203 The "payload_len", "payload_msg_start", and "payload_offset" fields 1204 are present only for transport objects of type "NORM_OBJECT_STREAM". 1205 These REQUIRED fields allow senders to arbitrarily vary the size of 1206 "NORM_DATA" payload segments for streams. This allows applications 1207 to flush transmitted streams as needed to meet unique streaming 1208 requirements. For objects of types "NORM_OBJECT_FILE" and 1209 "NORM_OBJECT_DATA", these fields are unnecessary since the receiver 1210 can calculate the payload length and offset information from the 1211 "fec_payload_id" using the REQUIRED block partitioning algorithm 1212 described in the FEC Building Block [RFC5052]. When systematic FEC 1213 codes (e.g., "fec_id" = 129) are used, the "payload_len", 1214 "payload_msg_start", and "payload_offset" fields contain actual 1215 payload_data length, message start index (or stream control code), 1216 and byte offset values for the associated application stream data 1217 segment (the remainder of the "payload_data" field content) for those 1218 "NORM_DATA" messages containing source data symbols. In "NORM_DATA" 1219 messages that contain FEC parity content, these fields do not contain 1220 values that can be directly interpreted, but instead are values 1221 computed from FEC encoding the "payload_len", "payload_msg_start", 1222 and "payload_offset" fields for the source data segments of the 1223 corresponding coding block. The actual "payload_msg_start", 1224 "payload_len" and "payload_offset" values of missing data content can 1225 be determined upon decoding a FEC coding block. Note that these 1226 fields do NOT contribute to the value of the "NORM_DATA" "hdr_len" 1227 field. These fields are present only when the "flags" portion of the 1228 "NORM_DATA" message indicate the transport object is of type 1229 "NORM_OBJECT_STREAM". 1231 The "payload_len" value, when non-zero, indicates the length (in 1232 bytes) of the source content contained in the associated 1233 "payload_data" field. However, when the "payload_len" value is equal 1234 to "ZERO", this indicates that the "payload_msg_start" field be 1235 alternatively interpreted as a "stream_control_code". The only 1236 "stream_control_code" value defined is "NORM_STREAM_END = 0". The 1237 "NORM_STREAM_END" code indicates that the sender is terminating 1238 transmission of stream content at the corresponding position in the 1239 stream and the receiver MUST NOT expect content (or request repair 1240 for any content) following that position in the stream. Additional 1241 specifications MAY extend the functionality of the NORM stream 1242 transport mode by defining additional stream control codes. These 1243 control codes are delivered to the recipient application reliably, 1244 in-order with respect to the streamed application data content. 1246 The "payload_msg_start" field serves one of two exclusive purposes. 1247 When the "payload_len" value is non-zero, the "payload_msg_start" 1248 field, when also set to a non-zero value, indicates that the 1249 associated "payload_data" content contains an application-defined 1250 message boundary (start-of-message). When such a message boundary is 1251 indicated, the first byte of an application-defined message, with 1252 respect to the "payload_data" field, will be found at an offset of 1253 "payload_msg_start - 1" bytes. Thus, if a "NORM_DATA" payload for a 1254 "NORM_OBJECT_STREAM" contains the start of an application message at 1255 the first byte of the "payload_data" field, the value of the 1256 "payload_msg_start" field will be '1'. NORM implementations SHOULD 1257 provide sender stream applications with a capability to mark message 1258 boundaries in this manner. Similarly, the NORM receiver 1259 implementation SHOULD enable the application to recover such message 1260 boundary information. This enables NORM receivers to "synchronize" 1261 reliable reception of transmitted message stream content in a 1262 meaningful way (i.e., meaningful to the application) at any time, 1263 whether joining a session already in progress, or departing the 1264 session and returning. Note that if the value of the 1265 "payload_msg_start" field is "ZERO", no message boundary is present. 1266 The "payload_msg_start" value will always be less than or equal to 1267 the "payload_len" value except for the special case of "payload_len = 1268 0", that indicates the "payload_msg_start" field be instead 1269 interpreted as a "stream_control_code" 1271 The "payload_offset" field indicates the relative byte position (from 1272 the sender stream transmission start) of the source content contained 1273 in the "payload_data" field. Note that for long-lived streams, the 1274 "payload_offset" field will wrap. 1276 The "payload_data" field contains the original application source or 1277 parity content for the symbol identified by the "fec_payload_id". 1278 The length of this field SHALL be limited to a maximum of the 1279 sender's NormSegmentSize bytes as given in the FTI for the object. 1280 Note the length of this field for messages containing parity content 1281 will always be of length NormSegmentSize. When encoding data 1282 segments of varying sizes, the FEC encoder SHALL assume "ZERO" value 1283 padding for data segments with length less than the NormSegmentSize. 1284 It is RECOMMENDED that a sender's NormSegmentSize generally be 1285 constant for the duration of a given sender's term of participation 1286 in the session, but can possibly vary on a per-object basis. The 1287 NormSegmentSize SHOULD be configurable by the sender application 1288 prior to session participation as needed for network topology MTU 1289 considerations. For IPv6, MTU discovery MAY be possibly leveraged at 1290 session startup to perform this configuration. The "payload_data" 1291 content MAY be delivered directly to the application for source 1292 symbols (when systematic FEC encoding is used) or upon decoding of 1293 the FEC block. For "NORM_OBJECT_FILE" and "NORM_OBJECT_STREAM" 1294 objects, the data segment length and offset can be calculated using 1295 the block partitioning algorithm described in the FEC Building Block 1296 [RFC5052]. For "NORM_OBJECT_STREAM" objects, the length and offset 1297 is obtained from the segment's corresponding embedded "payload_len" 1298 and "payload_offset" fields. 1300 4.2.2. NORM_INFO Message 1302 The "NORM_INFO" message is used to convey OPTIONAL, application- 1303 defined, out-of-band context information for transmitted NormObjects. 1304 An example "NORM_INFO" use for bulk file transfer is to place MIME 1305 type information for the associated file, data, or stream object into 1306 the "NORM_INFO" payload. Receivers could then use the "NORM_INFO" 1307 content to make a decision as whether to participate in reliable 1308 reception of the associated object. Each NormObject can have an 1309 independent unit of "NORM_INFO" associated with it. "NORM_DATA" 1310 messages contain a flag to indicate the availability of "NORM_INFO" 1311 for a given NormObject. NORM receivers will NACK for retransmission 1312 of "NORM_INFO" when they have not received it for a given NormObject. 1313 The size of the "NORM_INFO" content is limited to that of a single 1314 NormSegmentSize for the given sender. This atomic nature allows the 1315 "NORM_INFO" to be rapidly and efficiently repaired within the NORM 1316 reliable transmission process. 1318 When "NORM_INFO" content is available for a NormObject, the 1319 NORM_FLAG_INFO flag SHALL be set in "NORM_DATA" messages for the 1320 corresponding "object_transport_id" and the "NORM_INFO" message SHALL 1321 be transmitted as the first message for the NormObject. 1323 0 1 2 3 1324 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1325 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1326 |version| type=1| hdr_len | sequence | 1327 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1328 | source_id | 1329 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1330 | instance_id | grtt |backoff| gsize | 1331 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1332 | flags | fec_id | object_transport_id | 1333 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1334 | header_extensions (if applicable) | 1335 | ... | 1336 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1337 | payload_data | 1338 | ... | 1339 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1341 NORM_INFO Message Format 1343 The "version", "type", "hdr_len", "sequence", and "source_id" fields 1344 form the NORM Common Message Header as described in Section 4.1. The 1345 value of "hdr_len" field when no header extensions are present is 4. 1347 The "instance_id", "grtt", "backoff", "gsize", "flags", "fec_id", and 1348 "object_transport_id" fields carry the same information and serve the 1349 same purpose as with "NORM_DATA" messages. These values allow the 1350 receiver to prepare appropriate buffering, etc, for further 1351 transmissions from the sender when "NORM_INFO" is the first message 1352 received. 1354 As with "NORM_DATA" messages, the NORM FTI Header Extension (EXT_FTI) 1355 MAY be optionally applied to "NORM_INFO" messages. To conserve 1356 protocol overhead, NORM implementations MAY apply the EXT_FTI when 1357 used to "NORM_INFO" messages only and not to "NORM_DATA" messages. 1359 The "NORM_INFO" "payload_data" field contains sender application- 1360 defined content that can be used by receiver applications for various 1361 purposes as described above. 1363 4.2.3. NORM_CMD Messages 1365 "NORM_CMD" messages are transmitted by senders to perform a number of 1366 different protocol functions. This includes functions such as round- 1367 trip timing collection, congestion control functions, synchronization 1368 of sender/receiver repair "windows", and notification of sender 1369 status. A core set of "NORM_CMD" messages is enumerated. 1370 Additionally, a range of command types remain available for potential 1371 application-specific use. Some "NORM_CMD" types can have dynamic 1372 content attached. Any attached content will be limited to maximum 1373 length of the sender NormSegmentSize to retain the atomic nature of 1374 commands. All "NORM_CMD" messages begin with a common set of fields, 1375 after the usual NORM message common header. The standard "NORM_CMD" 1376 fields are: 1377 0 1 2 3 1378 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1379 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1380 |version| type=3| hdr_len | sequence | 1381 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1382 | source_id | 1383 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1384 | instance_id | grtt |backoff| gsize | 1385 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1386 | sub-type | | 1387 +-+-+-+-+-+-+-+-+ NORM_CMD Content + 1388 | ... | 1389 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1391 NORM_CMD Standard Fields 1393 The "version", "type", "hdr_len", "sequence", and "source_id" fields 1394 form the NORM Common Message Header as described in Section 4.1. The 1395 value of the "hdr_len" field for "NORM_CMD" messages without header 1396 extensions present depends upon the "sub-type" field. 1398 The "instance_id", "grtt", "backoff", and "gsize" fields provide the 1399 same information and serve the same purpose as with "NORM_DATA" and 1400 "NORM_INFO" messages. The "sub-type" field indicates the type of 1401 command to follow. The remainder of the "NORM_CMD" message is 1402 dependent upon the command sub-type. NORM command sub-types include: 1404 +-------------------------+----------+------------------------------+ 1405 | Command | Sub-type | Purpose | 1406 +-------------------------+----------+------------------------------+ 1407 | "NORM_CMD(FLUSH)" | 1 | Used to indicate sender | 1408 | | | temporary | 1409 | | | end-of-transmission. | 1410 | | | (Assists in robustly | 1411 | | | initiating outstanding | 1412 | | | repair requests from | 1413 | | | receivers). May also be | 1414 | | | optionally used to collect | 1415 | | | positive acknowledgment of | 1416 | | | reliable reception from | 1417 | | | subset of receivers. | 1418 | "NORM_CMD(EOT)" | 2 | Used to indicate sender | 1419 | | | permanent | 1420 | | | end-of-transmission. | 1421 | "NORM_CMD(SQUELCH)" | 3 | Used to advertise sender's | 1422 | | | current repair window in | 1423 | | | response to out-of-range | 1424 | | | NACKs from receivers. | 1425 | "NORM_CMD(CC)" | 4 | Used for GRTT measurement | 1426 | | | and collection of congestion | 1427 | | | control feedback. | 1428 | "NORM_CMD(REPAIR_ADV)" | 5 | Used to advertise sender's | 1429 | | | aggregated repair/feedback | 1430 | | | state for suppression of | 1431 | | | unicast feedback from | 1432 | | | receivers. | 1433 | "NORM_CMD(ACK_REQ)" | 6 | Used to request | 1434 | | | application-defined positive | 1435 | | | acknowledgment from a list | 1436 | | | of receivers (OPTIONAL). | 1437 | "NORM_CMD(APPLICATION)" | 7 | Used for application-defined | 1438 | | | purposes that need to | 1439 | | | temporarily preempt or | 1440 | | | supplement data transmission | 1441 | | | (OPTIONAL). | 1442 +-------------------------+----------+------------------------------+ 1444 4.2.3.1. NORM_CMD(FLUSH) Message 1446 The "NORM_CMD(FLUSH)" command is sent when the sender reaches the end 1447 of all data content and pending repairs it has queued for 1448 transmission. This can indicate either a temporary or permanent end 1449 of data transmission, but the sender is still willing to respond to 1450 repair requests. This command is repeated once per "2*GRTT_sender" 1451 to excite the receiver set for any outstanding repair requests up to 1452 and including the transmission point indicated within the 1453 "NORM_CMD(FLUSH)" message. The number of repeats is equal to 1454 "NORM_ROBUST_FACTOR" unless a list of receivers from which explicit 1455 positive acknowledgment is expected ("acking_node_list") is given. 1456 In that case, the "acking_node_list" is updated as acknowledgments 1457 are received and the "NORM_CMD(FLUSH)" is repeated according to the 1458 mechanism described in Section 5.5.3. The greater the 1459 "NORM_ROBUST_FACTOR", the greater the probability that all applicable 1460 receivers will be excited for acknowledgment or repair requests 1461 (NACKs) AND that the corresponding NACKs are delivered to the sender. 1462 A default value of "NORM_ROBUST_FACTOR" equal to 20 is RECOMMENDED. 1463 If a "NORM_NACK" message interrupts the flush process, the sender 1464 SHALL re-initiate the flush process after any resulting repair 1465 transmissions are completed. 1467 Note that receivers also employ a timeout mechanism to self-initiate 1468 NACKing (if there are outstanding repair needs) when no messages of 1469 any type are received from a sender. This inactivity timeout is 1470 related to the "NORM_CMD(FLUSH)" and "NORM_ROBUST_FACTOR" and is 1471 specified in Section 5.3. Receivers SHALL self-initiate the NACK 1472 repair process when the inactivity timeout has expired for a specific 1473 sender and the receiver has pending repairs needed from that sender. 1474 With a sufficiently large "NORM_ROBUST_FACTOR" value, data content is 1475 delivered with a high assurance of reliability. The penalty of a 1476 large "NORM_ROBUST_FACTOR" value is the potential transmission of 1477 excess "NORM_CMD(FLUSH)" messages and a longer inactivity timeout for 1478 receivers to self-initiate a terminal NACK process. 1480 For finite-size transport objects such as "NORM_OBJECT_DATA" and 1481 "NORM_OBJECT_FILE", the flush process (if there are no further 1482 pending objects) occurs at the end of these objects. Thus, FEC 1483 repair information is always available for repairs in response to 1484 repair requests elicited by the flush command. However, for 1485 "NORM_OBJECT_STREAM", the flush can occur at any time, including in 1486 the middle of an FEC coding block if systematic FEC codes are 1487 employed. In this case, the sender will not yet be able to provide 1488 FEC parity content for the concurrent coding block and will be 1489 limited to explicitly repairing the stream with source data content 1490 for that block. Applications that anticipate frequent flushing of 1491 stream content SHOULD be judicious in the selection of the FEC coding 1492 block size (i.e., do not use a very large coding block size if 1493 frequent flushing occurs). For example, a reliable multicast 1494 application transmitting an on-going series of intermittent, 1495 relatively small messages will need to trade-off using the 1496 "NORM_OBJECT_DATA" paradigm versus the "NORM_OBJECT_STREAM" paradigm 1497 with an appropriate FEC coding block size. This is analogous to 1498 application trade-offs for other transport protocols such as the 1499 selection of different TCP modes of operation such as "no delay", 1500 etc. 1502 0 1 2 3 1503 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1504 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1505 |version| type=3| hdr_len | sequence | 1506 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1507 | source_id | 1508 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1509 | instance_id | grtt |backoff| gsize | 1510 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1511 | sub-type = 1 | fec_id | object_transport_id | 1512 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1513 | fec_payload_id | 1514 | ... | 1515 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1516 | acking_node_list (if applicable) | 1517 | ... | 1518 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1520 NORM_CMD(FLUSH) Message Format 1522 The "version", "type", "hdr_len", "sequence", and "source_id" fields 1523 form the NORM Common Message Header as described in Section 4.1. In 1524 addition to the NORM common message header and standard "NORM_CMD" 1525 fields, the "NORM_CMD(FLUSH)" message contains fields to identify the 1526 current status and logical transmit position of the sender. 1528 The "fec_id" field indicates the FEC type used for the flushing 1529 "object_transport_id" and implies the size and format of the 1530 "fec_payload_id" field. Note the "hdr_len" value for the 1531 "NORM_CMD(FLUSH)" message is 4 plus the size of the "fec_payload_id" 1532 field when no header extensions are present. 1534 The "object_transport_id" and "fec_payload_id" fields indicate the 1535 sender's current logical "transmit position". These fields are 1536 interpreted in the same manner as in the "NORM_DATA" message type. 1537 Upon receipt of the "NORM_CMD(FLUSH)", receivers are expected to 1538 check their completion state THROUGH (including) this transmission 1539 position. If receivers have outstanding repair needs in this range, 1540 they SHALL initiate the NORM NACK Repair Process as described in 1541 Section 5.3. If receivers have no outstanding repair needs, no 1542 response to the "NORM_CMD(FLUSH)" is generated. 1544 For "NORM_OBJECT_STREAM" objects using systematic FEC codes, 1545 receivers MUST request "explicit-only" repair of the identified 1546 "source_block_number" if the given "encoding_symbol_id" is less than 1547 the "source_block_len". This condition indicates the sender has not 1548 yet completed encoding the corresponding FEC block and parity content 1549 is not yet available. An "explicit-only" repair request consists of 1550 NACK content for the applicable "source_block_number" that does not 1551 include any requests for parity-based repair. This allows NORM 1552 sender applications to "flush" an ongoing stream of transmission when 1553 needed, even if in the middle of an FEC block. Once the sender 1554 resumes stream transmission and passes the end of the pending coding 1555 block, subsequent NACKs from receivers SHALL request parity-based 1556 repair as usual. Note that the use of a systematic FEC code is 1557 assumed here. Note that a sender has the option of arbitrarily 1558 shortening a given code block when such an application "flush" 1559 occurs. In this case, the receiver will request explicit repair, but 1560 the sender MAY provide FEC-based repair (parity segments) in 1561 response. These parity segments MUST contain the corrected 1562 "source_block_len" for the shortened block and that 1563 "source_block_len" associated with segments containing parity content 1564 SHALL override the previously advertised "source_block_len". 1565 Similarly, the "source_block_len" associated with the highest ordinal 1566 "encoding_symbol_id" SHALL take precedence over prior symbols when a 1567 difference (e.g., due to code shortening at the sender) occurs. 1568 Normal receiver NACK initiation and construction is discussed in 1569 detail in Section 5.3. 1571 The OPTIONAL "acking_node_list" field contains a list of NormNodeIds 1572 for receivers from which the sender is requesting explicit positive 1573 acknowledgment of reception up through the transmission point 1574 identified by the "object_transport_id" and "fec_payload_id" fields. 1575 The length of the list can be inferred from the length of the 1576 received "NORM_CMD(FLUSH)" message. When the "acking_node_list" is 1577 present, the lightweight positive acknowledgment process described in 1578 Section 5.5.3 SHALL be observed. 1580 4.2.3.2. NORM_CMD(EOT) Message 1582 The "NORM_CMD(EOT)" command is sent when the sender reaches permanent 1583 end-of-transmission with respect to the NormSession and will not 1584 respond to further repair requests. This allows receivers to 1585 gracefully reach closure of operation with this sender (without 1586 requiring any timeout) and free any resources that are no longer 1587 needed. The "NORM_CMD(EOT)" command SHOULD be sent with the same 1588 robust mechanism as used for "NORM_CMD(FLUSH)" commands to provide a 1589 high assurance of reception by the receiver set. 1591 0 1 2 3 1592 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1593 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1594 |version| type=3| hdr_len | sequence | 1595 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1596 | source_id | 1597 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1598 | instance_id | grtt |backoff| gsize | 1599 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1600 | sub-type = 2 | reserved | 1601 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1603 NORM_CMD(EOT) Message Format 1605 The value of the "hdr_len" field for "NORM_CMD(EOT)" messages without 1606 header extensions present is 4. The "reserved" field is reserved for 1607 future use and MUST be set to an all "ZERO" value. Receivers MUST 1608 ignore the "reserved" field. 1610 4.2.3.3. NORM_CMD(SQUELCH) Message 1612 The "NORM_CMD(SQUELCH)" command is transmitted in response to 1613 outdated or invalid "NORM_NACK" content received by the sender. 1614 Invalid "NORM_NACK" content consists of repair requests for 1615 NormObjects for which the sender is unable or unwilling to provide 1616 repair. This includes repair requests for outdated objects, aborted 1617 objects, or those objects that the sender previously transmitted 1618 marked with the "NORM_FLAG_UNRELIABLE" flag. This command indicates 1619 to receivers what content is available for repair, thus serving as a 1620 description of the sender's current "repair window". Receivers SHALL 1621 NOT generate repair requests for content identified as invalid by a 1622 "NORM_CMD(SQUELCH)". 1624 The "NORM_CMD(SQUELCH)" command is sent once per "2*GRTT_sender" at 1625 the most. The "NORM_CMD(SQUELCH)" advertises the current "repair 1626 window" of the sender by identifying the earliest (lowest) 1627 transmission point for which it will provide repair, along with an 1628 encoded list of objects from that point forward that are no longer 1629 valid for repair. This mechanism allows the sender application to 1630 cancel or abort transmission and/or repair of specific previously 1631 enqueued objects. The list also contains the identifiers for any 1632 objects within the repair window that were sent with the 1633 "NORM_FLAG_UNRELIABLE" flag set. In normal conditions, the 1634 "NORM_CMD(SQUELCH)" will be needed infrequently, and generally only 1635 to provide a reference repair window for receivers who have fallen 1636 "out-of-sync" with the sender due to extremely poor network 1637 conditions. 1639 The starting point of the invalid NormObject list begins with the 1640 lowest invalid NormTransportId greater than the current "repair 1641 window" start from the invalid NACK(s) that prompted the generation 1642 of the squelch. The length of the list is limited by the sender's 1643 NormSegmentSize. This allows the receivers to learn the status of 1644 the sender's applicable object repair window with minimal 1645 transmission of "NORM_CMD(SQUELCH)" commands. The format of the 1646 "NORM_CMD(SQUELCH)" message is: 1647 0 1 2 3 1648 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1649 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1650 |version| type=3| hdr_len | sequence | 1651 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1652 | source_id | 1653 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1654 | instance_id | grtt |backoff| gsize | 1655 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1656 | sub-type = 3 | fec_id | object_transport_id | 1657 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1658 | fec_payload_id | 1659 | ... | 1660 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1661 | invalid_object_list | 1662 | ... | 1663 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1665 NORM_CMD(SQUELCH) Message Format 1667 In addition to the NORM common message header and standard "NORM_CMD" 1668 fields, the "NORM_CMD(SQUELCH)" message contains fields to identify 1669 the earliest logical transmit position of the sender's current repair 1670 window and an "invalid_object_list" beginning with the index of the 1671 logically earliest invalid repair request from the offending NACK 1672 message that initiated the "NORM_CMD(SQUELCH)" transmission. The 1673 value of the "hdr_len" field when no extensions are present is 4 plus 1674 the size of the "fec_payload_id" field that is dependent upon the FEC 1675 scheme identified by the "fec_id" field. 1677 The "object_transport_id" and "fec_payload_id" fields are 1678 concatenated to indicate the beginning of the sender's current repair 1679 window (i.e., the logically earliest point in its transmission 1680 history for which the sender can provide repair). The "fec_id" field 1681 implies the size and format of the "fec_payload_id" field. This 1682 serves as an advertisement of a "synchronization" point for receivers 1683 to request repair. Note, that while an "encoding_symbol_id" MAY be 1684 included in the "fec_payload_id" field, the sender's repair window 1685 SHOULD be aligned on FEC coding block boundaries and thus the 1686 "encoding_symbol_id" SHOULD be zero. 1688 The "invalid_object_list" is a list of 16-bit NormTransportIds that, 1689 although they are within the range of the sender's current repair 1690 window, are no longer available for repair from the sender. For 1691 example, a sender application MAY dequeue an out-of-date object even 1692 though it is still within the repair window. The total size of the 1693 "invalid_object_list" content is can be determined from the packet's 1694 payload length and is limited to a maximum of the NormSegmentSize of 1695 the sender. Thus, for very large repair windows, it is possible that 1696 a single "NORM_CMD(SQUELCH)" message cannot include the entire set of 1697 invalid objects in the repair window. In this case, the sender SHALL 1698 ensure that the list begins with a NormTransportId that is greater 1699 than or equal to the lowest ordinal invalid NormTransportId from the 1700 NACK message(s) that prompted the "NORM_CMD(SQUELCH)" generation. 1701 The NormTransportId in the "invalid_object_list" MUST be ordinally 1702 greater than the "object_transport_id" marking the beginning of the 1703 sender's repair window. This insures convergence of the squelch 1704 process, even if multiple invalid NACK/ squelch iterations are 1705 required. This explicit description of invalid content within the 1706 sender's current window allows the sender application (most notably 1707 for discrete object transport) to arbitrarily invalidate (i.e., 1708 dequeue) portions of enqueued content (e.g., certain objects) for 1709 which it no longer wishes to provide reliable transport. 1711 4.2.3.4. NORM_CMD(CC) Message 1713 The "NORM_CMD(CC)" messages contains fields to enable sender-to-group 1714 GRTT measurement and to excite the group for congestion control 1715 feedback. A baseline NORM congestion control scheme (NORM-CC), based 1716 on the TCP-Friendly Multicast Congestion Control (TFMCC) scheme of 1717 RFC 4654 is fully specified in Section 5.5.2 of this document. The 1718 "NORM_CMD(CC)" message is usually transmitted as part of NORM-CC 1719 congestion control operation. A NORM header extension is defined 1720 below to be used with the "NORM_CMD(CC)" message to support NORM-CC 1721 operation. Different header extensions MAY be defined for the 1722 "NORM_CMD(CC)" (and/or other NORM messages as needed) to support 1723 alternative congestion control schemes in the future. If NORM is 1724 operated in a network where resources are explicitly dedicated to the 1725 NORM session and therefore congestion control operation is disabled, 1726 the "NORM_CMD(CC)" message is then used solely for GRTT measurement 1727 and MAY be sent less frequently than with congestion control 1728 operation. 1730 0 1 2 3 1731 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1732 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1733 |version| type=3| hdr_len | sequence | 1734 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1735 | source_id | 1736 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1737 | instance_id | grtt |backoff| gsize | 1738 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1739 | sub-type = 4 | reserved | cc_sequence | 1740 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1741 | send_time_sec | 1742 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1743 | send_time_usec | 1744 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1745 | header extensions (if applicable) | 1746 | ... | 1747 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1748 | cc_node_list (if applicable) | 1749 | ... | 1750 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1752 NORM_CMD(CC) Message Format 1754 The NORM common message header and standard "NORM_CMD" fields serve 1755 their usual purposes. The value of the "hdr_len" field when no 1756 header extensions are present is 6. 1758 The "reserved" field is for potential future use and MUST be set to 1759 "ZERO" in this version of the NORM protocol and its baseline NORM-CC 1760 congestion control scheme. It is possible for alternative congestion 1761 control schemes to use the "NORM_CMD(CC)" message defined here and 1762 leverage the "reserved" field for scheme-specific purposes. 1764 The "cc_sequence" field is a sequence number applied by the sender. 1765 For NORM-CC operation, it is used to provide functionality equivalent 1766 to the "feedback round number" ("fb_nr") described in RFC 4654. The 1767 most recently received "cc_sequence" value is recorded by receivers 1768 and can be fed back to the sender in congestion control feedback 1769 generated by the receivers for that sender. The "cc_sequence" number 1770 can also be used in NORM implementations to assess how recently a 1771 receiver has received "NORM_CMD(CC)" probes from the sender. This 1772 can be useful instrumentation for complex or experimental multicast 1773 routing environments. 1775 The "send_time" field is a timestamp indicating the time that the 1776 "NORM_CMD(CC)" message was transmitted. This consists of a 64-bit 1777 field containing 32-bits with the time in seconds ("send_time_sec") 1778 and 32-bits with the time in microseconds ("send_time_usec") since 1779 some reference time the source maintains (usually 00:00:00, 1 January 1780 1970). The byte ordering of the fields is "Big Endian" network 1781 order. Receivers use this timestamp adjusted by the amount of delay 1782 from the time they received the "NORM_CMD(CC)" message to the time of 1783 their response as the "grtt_response" portion of "NORM_ACK" and 1784 "NORM_NACK" messages generated. This allows the sender to evaluate 1785 round-trip times to different receivers for congestion control and 1786 other (e.g., GRTT determination) purposes. 1788 To facilitate the baseline NORM-CC scheme described in Section 5.5.2, 1789 a NORM-CC Rate header extension (EXT_RATE) is defined to inform the 1790 group of the sender's current transmission rate. This is used along 1791 with the loss detection "sequence" field of all NORM sender messages 1792 and the "NORM_CMD(CC)" GRTT collection process to support NORM-CC 1793 congestion control operation. The format of this header extension is 1794 as follows: 1795 0 1 2 3 1796 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1797 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1798 | het = 128 | reserved | send_rate | 1799 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1801 The "send_rate" field indicates the sender's current transmission 1802 rate in bytes per second. The 16-bit "send_rate" field consists of 1803 12 bits of mantissa in the most significant portion and 4 bits of 1804 base 10 integer exponent (E) information in the least significant 1805 portion. The 12-bit mantissa portion of the field is scaled such 1806 that a base 10 mantissa (M) floating point value of 0.0 corresponds 1807 to 0 and a value of 10.0 corresponds to 4096 in the upper 12 bits of 1808 the 16-bit "send_rate" field. Thus: 1810 send_rate = (((int)(M * 4096.0 / 10.0 + 0.5)) << 4) | E; 1812 For example, to represent a transmission rate of 256kbps (3.2e+04 1813 bytes per second), the lower 4 bits of the 16-bit field contain a 1814 value of 0x04 to represent the exponent (E) while the upper 12 bits 1815 contain a value of 0x51f (M) as determined from the equation given 1816 above: 1817 send_rate = (((int)((3.2 * 4096.0 / 10.0) + 0.5)) << 4) | 4; 1818 = (0x51f << 4) | 0x4 1819 = 0x51f4 1821 To decode the "send_rate" field, the following equation can be used: 1822 value = (send_rate >> 4) * (10/4096) * power(10, (send_rate & x000f)) 1824 Note the maximum transmission rate that can be represented by this 1825 scheme is approximately 9.99e+15 bytes per second. 1827 When this extension is present, a "cc_node_list" might be attached as 1828 the payload of the "NORM_CMD(CC)" message. The presence of this 1829 header extension also implies that NORM receivers MUST respond 1830 according to the procedures described in Section 5.5.2. 1832 The "cc_node_list" consists of a list of NormNodeIds and their 1833 associated congestion control status. This includes the current 1834 limiting receiver (CLR) node, any potential limiting receiver (PLR) 1835 nodes that have been identified, and some number of receivers for 1836 which congestion control status is being provided, most notably 1837 including the receivers' current RTT measurement. The maximum length 1838 of the "cc_node_list" provides for at least the CLR and one other 1839 receiver, but can be increased for more timely feedback to the group. 1840 The list length can be inferred from the length of the "NORM_CMD(CC)" 1841 message. 1843 Each item in the "cc_node_list" is in the following format: 1844 0 1 2 3 1845 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1846 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1847 | cc_node_id | 1848 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1849 | cc_flags | cc_rtt | cc_rate | 1850 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1852 The "cc_node_id" is the NormNodeId of the receiver the item 1853 represents. 1855 The "cc_flags" field contains flags indicating the congestion control 1856 status of the indicated receiver. The following flags are defined: 1858 +----------------------+-------+------------------------------------+ 1859 | Flag | Value | Purpose | 1860 +----------------------+-------+------------------------------------+ 1861 | "NORM_FLAG_CC_CLR" | 0x01 | Receiver is the current limiting | 1862 | | | receiver (CLR). | 1863 | "NORM_FLAG_CC_PLR" | 0x02 | Receiver is a potential limiting | 1864 | | | receiver (PLR). | 1865 | "NORM_FLAG_CC_RTT" | 0x04 | Receiver has measured RTT with | 1866 | | | respect to sender. | 1867 | "NORM_FLAG_CC_START" | 0x08 | Sender/receiver is in "slow start" | 1868 | | | phase of congestion control | 1869 | | | operation (i.e., The receiver has | 1870 | | | not yet detected any packet loss | 1871 | | | and the "cc_rate" field is the | 1872 | | | receiver's actual measured receive | 1873 | | | rate). | 1874 | "NORM_FLAG_CC_LEAVE" | 0x10 | Receiver is imminently leaving the | 1875 | | | session and its feedback SHOULD | 1876 | | | not be considered in congestion | 1877 | | | control operation. | 1878 +----------------------+-------+------------------------------------+ 1880 The "cc_rtt" contains a quantized representation of the RTT as 1881 measured by the sender with respect to the indicated receiver. This 1882 field is valid only if the "NORM_FLAG_CC_RTT" flag is set in the 1883 "cc_flags" field. This one byte field is a quantized representation 1884 of the RTT using the algorithm described in the Multicast NACK 1885 Building Block [RFC5401]. 1887 The "cc_rate" field contains a representation of the receiver's 1888 current calculated (during steady-state congestion control operation) 1889 or twice its measured (during the slow start phase) congestion 1890 control rate. This field is encoded and decoded using the same 1891 technique as described for the "NORM_CMD(CC)" "send_rate" field. 1893 4.2.3.5. NORM_CMD(REPAIR_ADV) Message 1895 The "NORM_CMD(REPAIR_ADV)" message is used by the sender to 1896 "advertise" its aggregated repair state from "NORM_NACK" messages 1897 accumulated during a repair cycle and/or congestion control feedback 1898 received. This message is sent only when the sender has received 1899 "NORM_NACK" and/or "NORM_ACK(CC)" (when congestion control is 1900 enabled) messages via unicast transmission instead of multicast. By 1901 relaying this information to the receiver set, suppression of 1902 feedback can be achieved even when receivers are unicasting that 1903 feedback instead of multicasting it among the group [NormFeedback]. 1904 0 1 2 3 1905 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1906 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1907 |version| type=3| hdr_len | sequence | 1908 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1909 | source_id | 1910 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1911 | instance_id | grtt |backoff| gsize | 1912 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1913 | sub-type = 5 | flags | reserved | 1914 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1915 | header extensions (if applicable) | 1916 | ... | 1917 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1918 | repair_adv_payload | 1919 | ... | 1920 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1921 NORM_CMD(REPAIR_ADV) Message Format 1923 The "instance_id", "grtt", "backoff", "gsize", and "sub-type" fields 1924 serve the same purpose as in other "NORM_CMD" messages. The value of 1925 the "hdr_len" field when no extensions are present is 4. 1927 The "flags" field provide information on the "NORM_CMD(REPAIR_ADV)" 1928 content. There is currently one "NORM_CMD(REPAIR_ADV)" flag defined: 1929 NORM_REPAIR_ADV_FLAG_LIMIT = 0x01 1931 This flag is set by the sender when it is unable to fit its full 1932 current repair state into a single NormSegmentSize. If this flag is 1933 set, receivers SHALL limit their NACK response to generating NACK 1934 content only up through the maximum ordinal transmission position 1935 (objectTransportId::fecPayloadId) included in the 1936 "repair_adv_content". 1938 When congestion control operation is enabled, a header extension 1939 SHOULD be applied to the "NORM_CMD(REPAIR_ADV)" representing the most 1940 limiting (in terms of congestion control feedback suppression) 1941 congestion control response. This allows the "NORM_CMD(REPAIR_ADV)" 1942 message to suppress receiver congestion control responses as well as 1943 NACK feedback messages. The field is defined as a header extension 1944 so that alternative congestion control schemes can be used for NORM 1945 without revision to this document. A NORM-CC Feedback Header 1946 Extension (EXT_CC) is defined to encapsulate congestion control 1947 feedback within "NORM_NACK", "NORM_ACK", and "NORM_CMD(REPAIR_ADV)" 1948 messages. If another congestion control technique (e.g., Pragmatic 1949 General Multicast Congestion Control (PGMCC) [PgmccPaper]) is used 1950 within a NORM implementation, an additional header extension MAY need 1951 to be defined encapsulate any required feedback content. The NORM-CC 1952 Feedback Header Extension format is: 1953 0 1 2 3 1954 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1955 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1956 | het = 3 | hel = 3 | cc_sequence | 1957 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1958 | cc_flags | cc_rtt | cc_loss | 1959 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1960 | cc_rate | cc_reserved | 1961 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1963 The "cc_sequence" field contains the current greatest "cc_sequence" 1964 value receivers have received in "NORM_CMD(CC)" messages from the 1965 sender. This information assists the sender in congestion control 1966 operation by providing an indicator of how current ("fresh") the 1967 receiver's round-trip measurement reference time is and whether the 1968 receiver has been successfully receiving recent congestion control 1969 probes. For example, if it is apparent the receiver has not been 1970 receiving recent congestion control probes (and thus possibly other 1971 messages from the sender), the sender SHOULD choose to take 1972 congestion avoidance measures. For "NORM_CMD(REPAIR_ADV)" messages, 1973 the sender SHALL set the "cc_sequence" field value to the value set 1974 in the last "NORM_CMD(CC)" message sent. 1976 The "cc_flags" field contains bits representing the receiver's state 1977 with respect to congestion control operation. The possible values 1978 for the "cc_flags" field are those specified for the "NORM_CMD(CC)" 1979 message node list item flags. These fields are used by receivers in 1980 controlling (suppressing as necessary) their congestion control 1981 feedback. For "NORM_CMD(REPAIR_ADV)" messages, the 1982 "NORM_FLAG_CC_RTT" SHALL be set only when all feedback messages 1983 received by the sender have the flag set. Similarly, the 1984 "NORM_FLAG_CC_CLR" or "NORM_FLAG_CC_PLR" SHALL be set only when no 1985 feedback has been received from non-CLR or non-PLR receivers. And 1986 the "NORM_FLAG_CC_LEAVE" SHALL be set only when all feedback messages 1987 the sender has received have this flag set. These heuristics for 1988 setting the flags in "NORM_CMD(REPAIR_ADV)" ensure the most effective 1989 suppression of receivers providing unicast feedback messages. 1991 The "cc_rtt" field SHALL be set to a default maximum value and the 1992 "NORM_FLAG_CC_RTT" flag SHALL be cleared when no receiver has yet 1993 received RTT measurement information. When a receiver has received 1994 RTT measurement information, it SHALL set the "cc_rtt" value 1995 accordingly and set the "NORM_FLAG_CC_RTT" flag in the "cc_flags" 1996 field. For "NORM_CMD(REPAIR_ADV)" messages, the sender SHALL set the 1997 "cc_rtt" field value to the largest non-CLR/non-PLR RTT it has 1998 measured from receivers for the current feedback round. 2000 The "cc_loss" field represents the receiver's current packet loss 2001 fraction estimate for the indicated source. The loss fraction is a 2002 value from 0.0 to 1.0 corresponding to a range of zero to 100 percent 2003 packet loss. The 16-bit "cc_loss" value is calculated by the 2004 following formula: 2006 "cc_loss" = floor(decimal_loss_fraction * 65535.0) 2008 For "NORM_CMD(REPAIR_ADV)" messages, the sender SHALL set the 2009 "cc_loss" field value to the largest non-CLR/non-PLR loss estimate it 2010 has received from receivers for the current feedback round. 2012 The "cc_rate" field represents the receivers current local congestion 2013 control rate. During "slow start", when the receiver has detected no 2014 loss, this value is set to twice the actual rate it has measured from 2015 the corresponding sender and the "NORM_FLAG_CC_START" is set in the 2016 "cc_flags' field. Otherwise, the receiver calculates a congestion 2017 control rate based on its loss measurement and RTT measurement 2018 information (even if default) for the "cc_rate" field. For 2019 "NORM_CMD(REPAIR_ADV)" messages, the sender SHALL set the "cc_loss" 2020 field value to the lowest non-CLR/non-PLR "cc_rate" report it has 2021 received from receivers for the current feedback round. 2023 The "cc_reserved" field is reserved for future NORM protocol use. 2024 Currently, senders SHALL set this field to "ZERO", and receivers 2025 SHALL ignore the content of this field. 2027 The "repair_adv_payload" is in exactly the same form as the 2028 "nack_content" of "NORM_NACK" messages and can be processed by 2029 receivers for suppression purposes in the same manner, with the 2030 exception of the condition when the "NORM_REPAIR_ADV_FLAG_LIMIT" is 2031 set. 2033 4.2.3.6. NORM_CMD(ACK_REQ) Message 2035 The "NORM_CMD(ACK_REQ)" message is used by the sender to request 2036 acknowledgment from a specified list of receivers. This message is 2037 used in providing a lightweight positive acknowledgment mechanism 2038 that is OPTIONAL for use by the reliable multicast application. A 2039 range of acknowledgment request types is provided for use at the 2040 application's discretion. Provision for application-defined, 2041 positively-acknowledged commands allows the application to 2042 automatically take advantage of transmission and round-trip timing 2043 information available to the NORM protocol. The details of the NORM 2044 positive acknowledgment process including transmission of the 2045 "NORM_CMD(ACK_REQ)" messages and the receiver response ("NORM_ACK") 2046 are described in Section 5.5.3. The format of the 2047 "NORM_CMD(ACK_REQ)" message is: 2048 0 1 2 3 2049 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2050 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2051 |version| type=3| hdr_len | sequence | 2052 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2053 | source_id | 2054 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2055 | instance_id | grtt |backoff| gsize | 2056 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2057 | sub-type = 6 | reserved | ack_type | ack_id | 2058 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2059 | acking_node_list | 2060 | ... | 2061 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2063 NORM_CMD(ACK_REQ) Message Format 2065 The NORM common message header and standard "NORM_CMD" fields serve 2066 their usual purposes. The value of the "hdr_len" field for 2067 "NORM_CMD(ACK_REQ)" messages with no header extension present is 4. 2069 The "ack_type" field indicates the type of acknowledgment being 2070 requested and thus implies rules for how the receiver will treat this 2071 request. The following "ack_type" values are defined and are also 2072 used in "NORM_ACK" messages described later: 2074 +------------------------+------------+-----------------------------+ 2075 | ACK Type | Value | Purpose | 2076 +------------------------+------------+-----------------------------+ 2077 | "NORM_ACK_CC" | 1 | Used to identify "NORM_ACK" | 2078 | | | messages sent in response | 2079 | | | to "NORM_CMD(CC)" messages. | 2080 | "NORM_ACK_FLUSH" | 2 | Used to identify "NORM_ACK" | 2081 | | | messages sent in response | 2082 | | | to "NORM_CMD(FLUSH)" | 2083 | | | messages. | 2084 | "NORM_ACK_RESERVED" | 3-15 | Reserved for possible | 2085 | | | future NORM protocol use. | 2086 | "NORM_ACK_APPLICATION" | 16-255 | Used at application's | 2087 | | | discretion. | 2088 +------------------------+------------+-----------------------------+ 2090 The "NORM_ACK_CC" value is provided for use only in "NORM_ACKs" 2091 generated in response to the "NORM_CMD(CC)" messages used in 2092 congestion control operation. Similarly, the "NORM_ACK_FLUSH" is 2093 provided for use only in "NORM_ACKs" generated in response to 2094 applicable "NORM_CMD(FLUSH)" messages. "NORM_CMD"(ACK_REQ) messages 2095 with "ack_type" of "NORM_ACK_CC" or "NORM_ACK_FLUSH" SHALL NOT be 2096 generated by the sender. 2098 The "NORM_ACK_RESERVED" range of "ack_type" values is provided for 2099 possible future NORM protocol use. 2101 The "NORM_ACK_APPLICATION" range of "ack_type" values is provided so 2102 that NORM applications can implement application-defined, positively- 2103 acknowledged commands that are able to leverage internal transmission 2104 and round-trip timing information available to the NORM protocol 2105 implementation. 2107 The "ack_id" provides a sequenced identifier for the given 2108 "NORM_CMD(ACK_REQ)" message. This "ack_id" is returned in "NORM_ACK" 2109 messages generated by the receivers so that the sender can associate 2110 the response with its corresponding request. 2112 The "reserved" field is reserved for possible future protocol use and 2113 SHALL be set to "ZERO" by senders and ignored by receivers. 2115 The "acking_node_list" field contains the NormNodeIds of the current 2116 NORM receivers that are desired to provide positive acknowledge 2117 ("NORM_ACK") to this request. The packet payload length implies the 2118 length of the "acking_node_list" and its length is limited to the 2119 sender NormSegmentSize. The individual NormNodeId items are listed 2120 in network (Big Endian) byte order. If a receiver's NormNodeId is 2121 included in the "acking_node_list", it SHALL schedule transmission of 2122 a "NORM_ACK" message as described in Section 5.5.3. 2124 4.2.3.7. NORM_CMD(APPLICATION) Message 2126 This command allows the NORM application to robustly transmit 2127 application-defined commands. The command message preempts any 2128 ongoing data transmission and is repeated up to "NORM_ROBUST_FACTOR" 2129 times at a rate of once per "2*GRTT_sender". This rate of repetition 2130 allows the application to observe any response (if that is the 2131 application's purpose for the command) before it is repeated. 2132 Possible responses can include initiation of data transmission, other 2133 "NORM_CMD(APPLICATION)" messages, or even application-defined, 2134 positively-acknowledge commands from other NormSession participants. 2135 The transmission of these commands will preempt data transmission 2136 when they are scheduled and can be multiplexed with ongoing data 2137 transmission. This type of robustly transmitted command allows NORM 2138 applications to define a complete set of session control mechanisms 2139 with less state than the transfer of FEC encoded reliable content 2140 needs while taking advantage of NORM transmission and round-trip 2141 timing information. 2142 0 1 2 3 2143 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2144 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2145 |version| type=3| hdr_len | sequence | 2146 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2147 | source_id | 2148 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2149 | instance_id | grtt |backoff| gsize | 2150 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2151 | sub-type = 7 | reserved | 2152 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2153 | Application-Defined Content | 2154 | ... | 2155 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2157 NORM_CMD(APPLICATION) Message Format 2159 The NORM common message header and "NORM_CMD" fields are interpreted 2160 as previously described. The value of the "NORM_CMD(APPLICATION)" 2161 "hdr_len" field when no header extensions are present is 4. 2163 The "Application-Defined Content" area contains information in a 2164 format at the discretion of the application. The size of this 2165 payload SHALL be limited to a maximum of the sender's NormSegmentSize 2166 setting. Upon reception, the NORM protocol implementation SHALL 2167 deliver the content to the receiver application. Note that any 2168 detection of duplicate reception of a "NORM_CMD(APPLICATION)" message 2169 is the responsibility of the application. 2171 4.3. Receiver Messages 2173 The NORM message types generated by participating receivers consist 2174 of the "NORM_NACK" and "NORM_ACK" message types. "NORM_NACK" 2175 messages are sent to request repair of missing data content from 2176 sender transmission and "NORM_ACK" messages are generated in response 2177 to certain sender commands including "NORM_CMD(CC)" and 2178 "NORM_CMD(ACK_REQ)". 2180 4.3.1. NORM_NACK Message 2182 The principal purpose of "NORM_NACK" messages is for receivers to 2183 request repair of sender content via selective, negative 2184 acknowledgment upon detection of incomplete data. "NORM_NACK" 2185 messages will be transmitted according to the rules of "NORM_NACK" 2186 generation and suppression described in Section 5.3. "NORM_NACK" 2187 messages also contain additional fields to provide feedback to the 2188 sender(s) for purposes of round-trip timing collection and congestion 2189 control. 2191 The payload of "NORM_NACK" messages contains one or more repair 2192 requests for different objects or portions of those objects. The 2193 "NORM_NACK" message format is as follows: 2195 0 1 2 3 2196 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2197 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2198 |version| type=4| hdr_len | sequence | 2199 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2200 | source_id | 2201 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2202 | server_id | 2203 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2204 | instance_id | reserved | 2205 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2206 | grtt_response_sec | 2207 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2208 | grtt_response_usec | 2209 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2210 | header extensions (if applicable) | 2211 | ... | 2212 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2213 | nack_payload | 2214 | ... | 2215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2217 NORM_NACK Message Format 2219 The NORM common message header fields serve their usual purposes. 2220 The value of the "hdr_len" field for "NORM_NACK" messages without 2221 header extensions present is 6. 2223 The "server_id" field identifies the NORM sender to which the 2224 "NORM_NACK" message is destined. 2226 The "instance_id" field contains the current session identifier given 2227 by the sender identified by the "server_id" field in its sender 2228 messages. The sender SHOULD ignore feedback messages containing an 2229 invalid "instance_id" value. 2231 The "grtt_response" fields contain an adjusted version of the 2232 timestamp from the most recently received "NORM_CMD(CC)" message for 2233 the indicated NORM sender. The format of the "grtt_response" is the 2234 same as the "send_time" field of the "NORM_CMD(CC)". The 2235 "grtt_response" value is relative to the "send_time" the source 2236 provided with a corresponding "NORM_CMD(CC)" command. The receiver 2237 adjusts the source's "NORM_CMD(CC)" "send_time" timestamp by adding 2238 the time delta from when the receiver received the "NORM_CMD(CC)" to 2239 when the "NORM_NACK" is transmitted in response to calculate the 2240 value in the "grtt_response" field. This is the 2241 "receive_to_response_delta" value used in the following formula: 2242 grtt_response = NORM_CMD(CC) send_time + receive_to_response_delta 2244 The receiver SHALL set the "grtt_response" to a "ZERO" value, to 2245 indicate it has not yet received a "NORM_CMD(CC)" message from the 2246 indicated sender and the sender MUST ignore the "grtt_response" in 2247 this message. 2249 For NORM-CC operation, the NORM-CC Feedback Header Extension, as 2250 described in the "NORM_CMD(REPAIR_ADV}" message description, is added 2251 to "NORM_NACK" messages to provide feedback on the receivers current 2252 state with respect to congestion control operation. Alternative 2253 header extensions for congestion control feedback MAY be defined for 2254 alternative congestion control schemes for NORM use in the future. 2256 The "reserved" field is for potential future NORM use and SHALL be 2257 set to "ZERO" for this version of the protocol. 2259 The "nack_payload" of the "NORM_NACK" message specifies the repair 2260 needs of the receiver with respect to the NORM sender indicated by 2261 the "server_id" field. The receiver constructs repair requests based 2262 on the "NORM_DATA" and/or "NORM_INFO" segments it needs from the 2263 sender to complete reliable reception up to the sender's transmission 2264 position at the moment the receiver initiates the NACK Procedure as 2265 described in Section 5.3. A single NORM Repair Request consists of a 2266 list of items, ranges, and/or FEC coding block erasure counts for 2267 needed "NORM_DATA" and/or "NORM_INFO" content. Multiple repair 2268 requests can be concatenated within the "nack_payload" field of a 2269 "NORM_NACK" message. A single NORM Repair Request can possibly 2270 include multiple "items", "ranges", or "erasure_counts". In turn, 2271 the "nack_payload" field MAY contain multiple repair requests. A 2272 single NORM Repair Request has the following format: 2273 0 1 2 3 2274 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2275 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2276 | form | flags | length | 2277 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2278 | repair_request_items | 2279 | ... | 2280 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2282 NORM Repair Request Format 2284 The "form" field indicates the type of repair request items given in 2285 the "repair_request_items" list. Possible values for the "form" 2286 field include: 2288 +----------------------+-------+ 2289 | Form | Value | 2290 +----------------------+-------+ 2291 | "NORM_NACK_ITEMS" | 1 | 2292 | "NORM_NACK_RANGES" | 2 | 2293 | "NORM_NACK_ERASURES" | 3 | 2294 +----------------------+-------+ 2296 A "form" value of "NORM_NACK_ITEMS" indicates each repair request 2297 item in the "repair_request_items" list is to be treated as an 2298 individual request. A value of "NORM_NACK_RANGES" indicates the 2299 "repair_request_items" list consists of pairs of repair request items 2300 corresponding to the inclusive ranges of repair needs. And the 2301 "NORM_NACK_ERASURES" "form" indicates the repair request items are to 2302 be treated individually and the "encoding_symbol_id" portion of the 2303 "fec_payload_id" field of the repair request item (see below) is to 2304 be interpreted as an erasure count for the FEC coding block 2305 identified by the repair request item's "source_block_number". 2307 The "flags" field is currently used to indicate the level of data 2308 content for which the repair request items apply (i.e., an individual 2309 segment, entire FEC coding block, or entire transport object). 2310 Possible flag values include: 2312 +---------------------+-------+-------------------------------------+ 2313 | Flag | Value | Purpose | 2314 +---------------------+-------+-------------------------------------+ 2315 | "NORM_NACK_SEGMENT" | 0x01 | Indicates the listed segment(s) or | 2316 | | | range of segments needed as repair. | 2317 | "NORM_NACK_BLOCK" | 0x02 | Indicates the listed block(s) or | 2318 | | | range of blocks in entirety are | 2319 | | | needed as repair. | 2320 | "NORM_NACK_INFO" | 0x04 | Indicates "NORM_INFO" is needed as | 2321 | | | repair for the listed object(s). | 2322 | "NORM_NACK_OBJECT" | 0x08 | Indicates the listed object(s) or | 2323 | | | range of objects in entirety are | 2324 | | | needed as repair. | 2325 +---------------------+-------+-------------------------------------+ 2327 When the "NORM_NACK_SEGMENT" flag is set, the "object_transport_id" 2328 and "fec_payload_id" fields are used to determine which sets or 2329 ranges of individual "NORM_DATA" segments are needed to repair 2330 content at the receiver. When the "NORM_NACK_BLOCK" flag is set, 2331 this indicates the receiver is completely missing the indicated 2332 coding block(s) and transmissions sufficient to repair the indicated 2333 block(s) in their entirety are needed. When the "NORM_NACK_INFO" 2334 flag is set, this indicates the receiver is missing the "NORM_INFO" 2335 segment for the indicated "object_transport_id". Note the 2336 "NORM_NACK_INFO" can be set in combination with the "NORM_NACK_BLOCK" 2337 or "NORM_NACK_SEGMENT" flags, or can be set alone. When the 2338 "NORM_NACK_OBJECT" flag is set, this indicates the receiver is 2339 missing the entire NormTransportObject referenced by the 2340 "object_transport_id". This also implicitly requests any available 2341 "NORM_INFO" for the NormObject, if applicable. The "fec_payload_id" 2342 field is ignored when the flag "NORM_NACK_OBJECT" is set. 2344 The "length" field value is the length in bytes of the 2345 "repair_request_items" field. 2347 The "repair_request_items" field consists of a list of individual or 2348 range pairs of transport data unit identifiers in the following 2349 format. 2350 0 1 2 3 2351 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2352 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2353 | fec_id | reserved | object_transport_id | 2354 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2355 | fec_payload_id | 2356 | ... | 2357 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2359 NORM Repair Request Item Format 2361 The "fec_id" indicates the FEC type and can be used to determine the 2362 format of the "fec_payload_id" field. The "reserved" field is kept 2363 for possible future use and SHALL be set to a "ZERO" value and 2364 ignored by NORM nodes processing NACK content. 2366 The "object_transport_id" corresponds to the NormObject for which 2367 repair is being requested and the "fec_payload_id" identifies the 2368 specific FEC coding block and/or segment being requested. When the 2369 "NORM_NACK_OBJECT" flag is set, the value of the "fec_payload_id" 2370 field is ignored. When the "NORM_NACK_BLOCK" flag is set, only the 2371 FEC code block identifier portion of the "fec_payload_id" is to be 2372 interpreted. 2374 The format of the "fec_payload_id" field depends upon the "fec_id" 2375 field value. 2377 When the receiver's repair needs dictate that different forms (mixed 2378 ranges and/or individual items) or types (mixed specific segments 2379 and/or blocks or objects in entirety) are needed to complete reliable 2380 transmission, multiple NORM Repair Requests with different "form" and 2381 or "flags" values can be concatenated within a single "NORM_NACK" 2382 message. Additionally, NORM receivers SHALL construct "NORM_NACK" 2383 messages with their repair requests in ordinal order with respect to 2384 "object_transport_id" and "fec_payload_id" values. The 2385 "nack_payload" size SHALL NOT exceed the NormSegmentSize for the 2386 sender to which the "NORM_NACK" is destined. 2388 NORM_NACK Content Examples: 2390 In these examples, a small block, systematic FEC code ("fec_id" = 2391 129) is assumed with a user data block length of 32 segments. In 2392 Example 1, a list of individual "NORM_NACK_ITEMS" repair requests is 2393 given. In Example 2, a list of "NORM_NACK_RANGES" requests AND a 2394 single "NORM_NACK_ITEMS" request are concatenated to illustrate the 2395 possible content of a "NORM_NACK" message. Note that FEC coding 2396 block erasure counts could also be provided in each case. However, 2397 the erasure counts are not really necessary since the sender can 2398 easily determine the erasure count while processing the NACK content. 2399 However, the erasure count option can be useful for operation with 2400 other FEC codes or for intermediate system purposes. 2402 Example 1: "NORM_NACK" "nack_payload" for: Object 12, Coding Block 3, 2403 Segments 2,5,and 8 2404 0 1 2 3 2405 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2406 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2407 | form = 1 | flags = 0x01 | length = 36 | 2408 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2409 | fec_id = 129 | reserved | object_transport_id = 12 | 2410 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2411 | source_block_number = 3 | 2412 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2413 | source_block_length = 32 | encoding_symbol_id = 2 | 2414 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2415 | fec_id = 129 | reserved | object_transport_id = 12 | 2416 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2417 | source_block_number = 3 | 2418 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2419 | source_block_length = 32 | encoding_symbol_id = 5 | 2420 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2421 | fec_id = 129 | reserved | object_transport_id = 12 | 2422 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2423 | source_block_number = 3 | 2424 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2425 | source_block_length = 32 | encoding_symbol_id = 8 | 2426 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2428 Example 2: "NORM_NACK" "nack_payload" for: Object 18, Coding Block 6, 2429 Segments 5, 6, 7, 8, 9, 10; and Object 19 "NORM_INFO" and Coding 2430 Block 1, segment 3 2431 0 1 2 3 2432 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2433 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2434 | form = 2 | flags = 0x01 | length = 24 | 2435 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2436 | fec_id = 129 | reserved | object_transport_id = 18 | 2437 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2438 | source_block_number = 6 | 2439 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2440 | source_block_length = 32 | encoding_symbol_id = 5 | 2441 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2442 | fec_id = 129 | reserved | object_transport_id = 18 | 2443 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2444 | source_block_number = 6 | 2445 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2446 | source_block_length = 32 | encoding_symbol_id = 10 | 2447 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2448 | form = 1 | flags = 0x05 | length = 12 | 2449 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2450 | fec_id = 129 | reserved | object_transport_id = 19 | 2451 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2452 | source_block_number = 1 | 2453 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2454 | source_block_length = 32 | encoding_symbol_id = 3 | 2455 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2457 4.3.2. NORM_ACK Message 2459 The "NORM_ACK" message is intended to be used primarily as part of 2460 NORM congestion control operation and round-trip timing measurement. 2461 The acknowledgment type "NORM_ACK_CC" is provided for this purpose as 2462 described in the "NORM_CMD(ACK_REQ)" message description. The 2463 generation of "NORM_ACK(CC)" messages for round-trip timing 2464 estimation and congestion-control operation is described in 2465 Section 5.5.1 and Section 5.5.2, respectively. However, some 2466 multicast applications can benefit from some limited form of positive 2467 acknowledgment for certain functions. A simple, scalable positive 2468 acknowledgment scheme is defined in Section 5.5.3 that can be 2469 leveraged by protocol implementations when appropriate. The 2470 "NORM_CMD(FLUSH)" can also be used for OPTIONAL collection of 2471 positive acknowledgment of reliable reception to a certain 2472 "watermark" transmission point from specific receivers using this 2473 mechanism. The "NORM_ACK" type "NORM_ACK_FLUSH" is provided for this 2474 purpose and the format of the "nack_payload" for this acknowledgment 2475 type is given below. Beyond that, a range of application-defined 2476 "ack_type" values is provided for use at the NORM application's 2477 discretion. Implementations making use of application-defined 2478 positive acknowledgments MAY also make use the "nack_payload" as 2479 needed, observing the constraint that the "nack_payload" field size 2480 be limited to a maximum of the NormSegmentSize for the sender to 2481 which the "NORM_ACK" is destined. 2482 0 1 2 3 2483 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2484 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2485 |version| type=5| hdr_len | sequence | 2486 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2487 | source_id | 2488 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2489 | server_id | 2490 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2491 | instance_id | ack_type | ack_id | 2492 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2493 | grtt_response_sec | 2494 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2495 | grtt_response_usec | 2496 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2497 | header extensions (if applicable) | 2498 | ... | 2499 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2500 | ack_payload (if applicable) | 2501 | ... | 2502 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2504 NORM_ACK Message Format 2506 The NORM common message header fields serve their usual purposes. 2507 The value of the "hdr_len" field when no header extensions are 2508 present is 6. 2510 The "server_id", "instance_id", and "grtt_response" fields serve the 2511 same purpose as the corresponding fields in "NORM_NACK" messages. 2512 And header extensions can be applied to support congestion control 2513 feedback or other functions in the same manner. 2515 The "ack_type" field indicates the nature of the "NORM_ACK" message. 2516 This directly corresponds to the "ack_type" field of the 2517 "NORM_CMD(ACK_REQ)" message to which this acknowledgment applies. 2519 The "ack_id" field serves as a sequence number so the sender can 2520 verify a received "NORM_ACK" message actually applies to a current 2521 acknowledgment request. The "ack_id" field is not used in the case 2522 of the "NORM_ACK_CC" and "NORM_ACK_FLUSH" acknowledgment types. 2524 The "ack_payload" format is a function of the "ack_type". The 2525 "NORM_ACK_CC" message has no attached content. Only the "NORM_ACK" 2526 header applies. In the case of "NORM_ACK_FLUSH", a specific 2527 "ack_payload" format is defined: 2528 0 1 2 3 2529 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2530 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2531 | fec_id | reserved | object_transport_id | 2532 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2533 | fec_payload_id | 2534 | ... | 2535 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2537 The "object_transport_id" and "fec_payload_id" are used by the 2538 receiver to acknowledge applicable "NORM_CMD(FLUSH)" messages 2539 transmitted by the sender identified by the "server_id" field. 2541 The "ack_payload" of "NORM_ACK" messages for application-defined 2542 "ack_type" values is specific to the application but is limited in 2543 size to a maximum the NormSegmentSize of the sender referenced by the 2544 "server_id". 2546 4.4. General Purpose Messages 2548 Some additional message formats are defined for general purpose in 2549 NORM multicast sessions whether the participant is acting as a sender 2550 and/or receiver within the group. 2552 4.4.1. NORM_REPORT Message 2554 This is an OPTIONAL message generated by NORM participants. This 2555 message can be used for periodic performance reports from receivers 2556 in experimental NORM implementations. The format of this message is 2557 currently undefined. Experimental NORM implementations MAY define 2558 "NORM_REPORT" formats as needed for test purposes. These report 2559 messages SHOULD be disabled for interoperability testing between 2560 different compliant NORM implementations. 2562 5. Detailed Protocol Operation 2564 This section describes the detailed interactions of senders and 2565 receivers participating in a NORM session. A simple synopsis of 2566 protocol operation is given here: 2568 1. The sender periodically transmits "NORM_CMD(CC)" messages as 2569 needed to initialize and collect round-trip timing and congestion 2570 control feedback from the receiver set. 2572 2. The sender transmits an ordinal set of NormObjects segmented in 2573 the form of "NORM_DATA" messages labeled with NormTransportIds 2574 and logically identified with FEC encoding block numbers and 2575 symbol identifiers. "When applicable, NORM_INFO" messages MAY 2576 optionally precede the transmission of data content for NORM 2577 transport objects. 2579 3. As receivers detect missing content from the sender, they 2580 initiate repair requests with "NORM_NACK" messages. The 2581 receivers track the sender's most recent objectTransportId:: 2582 fecPayloadId transmit position and NACK only for content that is 2583 ordinally prior to that current transmit position. The receivers 2584 schedule random backoff timeouts before generating "NORM_NACK" 2585 messages and wait an appropriate amount of time before repeating 2586 the "NORM_NACK" if their repair request is not satisfied. 2588 4. The sender aggregates repair requests from the receivers and 2589 logically "rewinds" its transmit position to send appropriate 2590 repair messages. The sender sends repairs for the earliest 2591 ordinal transmit position first and maintains this ordinal repair 2592 transmission sequence. FEC parity content not previously 2593 transmitted for the applicable FEC coding block is used for 2594 repair transmissions to the greatest extent possible. If the 2595 sender exhausts its available FEC parity content on multiple 2596 repair cycles for the same coding block, it resorts to an 2597 explicit repair strategy (possibly using parity content) to 2598 complete repairs. (The use of explicit repair is an exception in 2599 general protocol operation, but the possibility does exist for 2600 extreme conditions). The sender immediately assumes transmission 2601 of new content once it has sent pending repairs. 2603 5. The sender transmits "NORM_CMD(FLUSH)" messages when it reaches 2604 the end of enqueued transmit content and pending repairs. 2605 Receivers respond to the "NORM_CMD(FLUSH)" messages with 2606 "NORM_NACK" transmissions (following the same suppression backoff 2607 timeout strategy as for data) if they need further repair. 2609 6. The sender transmissions are subject to rate control limits 2610 determined by congestion control mechanisms. In the baseline 2611 NORM-CC operation, each sender in a NormSession maintains its own 2612 independent congestion control state. Receivers provide 2613 congestion control feedback in "NORM_NACK" and "NORM_ACK" 2614 messages. "NORM_ACK" feedback for congestion control purposes is 2615 governed using a suppression mechanism similar to that for 2616 "NORM_NACK" messages. 2618 While this overall concept is relatively simple, there are details to 2619 each of these aspects that need to be addressed for successful, 2620 efficient, robust, and scalable NORM protocol operation. 2622 5.1. Sender Initialization and Transmission 2624 Upon startup, the NORM sender immediately begins sending 2625 "NORM_CMD(CC)" messages to collect round trip timing and other 2626 information from the potential group. If NORM-CC congestion control 2627 operation is enabled, the NORM-CC Rate header extension MUST be 2628 included in these messages. Congestion control operation SHALL be 2629 observed at all times when not operating using dedicated resources, 2630 like in the general Internet. Even if congestion control operation 2631 is disabled at the sender, it can be desirable to use the 2632 "NORM_CMD(CC)" messaging to collect feedback from the group using the 2633 baseline NORM-CC feedback mechanisms. This proactive feedback 2634 collection can be used to establish a GRTT estimate prior to data 2635 transmission and potential NACK operation. 2637 In some cases, applications might need the sender to also proceed 2638 with data transmission immediately. In other cases, the sender might 2639 wish to defer data transmission until it has received some feedback 2640 or request from the receiver set indicating receivers are indeed 2641 present. Note, in some applications (e.g., web push), this 2642 indication MAY come out-of-band with respect to the multicast session 2643 via other means. As noted, the periodic transmission of 2644 "NORM_CMD(CC)" messages MAY precede actual data transmission in order 2645 to have an initial GRTT estimate. 2647 With inclusion of the OPTIONAL NORM FEC Object Transmission 2648 Information Header Extension (EXT_FTI), the NORM protocol sender 2649 message headers can contain all information necessary to prepare 2650 receivers for subsequent reliable reception. This includes FEC 2651 coding parameters, the sender NormSegmentSize, and other information. 2652 If this header extension is not used, it is presumed receivers have 2653 received the FEC Object Transmission Information via other means. 2654 Additionally, applications MAY leverage the use of "NORM_INFO" 2655 messages associated with the session data objects in the session to 2656 provide application-specific context information for the session and 2657 data being transmitted. These mechanisms allow for operation with 2658 minimal pre-coordination among the senders and receivers. 2660 The NORM sender begins segmenting application-enqueued data into 2661 "NORM_DATA" segments and transmitting it to the group. For objects 2662 of type "NORM_OBJECT_DATA" and "NORM_OBJECT_FILE", the segmentation 2663 algorithm described in FEC Building Block [RFC5052] is RECOMMENDED. 2664 For objects of type "NORM_OBJECT_STREAM", segmentation will typically 2665 be into uniform FEC coding block sizes, with individual segment sizes 2666 controlled by the application. In most cases, the application and 2667 NORM implementation SHOULD strive to produce full-sized 2668 ("NormSegmentSize") segments when possible. The rate of transmission 2669 is controlled via congestion control mechanisms or is a fixed rate if 2670 desired for closed network operations. The receivers participating 2671 in the multicast group provide feedback to the sender as needed. 2672 When the sender reaches the end of data it has enqueued for 2673 transmission or any pending repairs, it transmits a series of 2674 "NORM_CMD(FLUSH)" messages at a rate of one per "2*GRTT_sender". 2675 Similar to end of each transmitted FEC coding block during 2676 transmission, receivers SHALL respond to these "NORM_CMD(FLUSH)" 2677 messages with additional repair requests as needed. A protocol 2678 parameter ""NORM_ROBUST_FACTOR"" determines the number of flush 2679 messages sent. If receivers request repair, the repair is provided 2680 and flushing occurs again at the end of repair transmission. The 2681 sender MAY attach an OPTIONAL "acking_node_list" to "NORM_CMD(FLUSH)" 2682 containing the NormNodeIds for receivers from which it expects 2683 explicit positive acknowledgment of reception. The "NORM_CMD(FLUSH)" 2684 message MAY be also used for this OPTIONAL purpose any time prior to 2685 the end of data enqueued for transmission with the "NORM_CMD(FLUSH)" 2686 messages multiplexed with ongoing data transmissions. The OPTIONAL 2687 NORM positive acknowledgment procedure is described in Section 5.5.3. 2689 5.1.1. Object Segmentation Algorithm 2691 NORM senders and receivers MUST use a common algorithm for logically 2692 segmenting transport data into FEC encoding blocks and symbols so 2693 appropriate NACKs can be constructed to request repair of missing 2694 data. NORM FEC coding blocks are comprised of multi-byte symbols 2695 (segments) transmitted in the payload of "NORM_DATA" messages. Each 2696 "NORM_DATA" message will contain one or more source or encoding 2697 symbol(s) identified by the "fec_payload_id" field and the 2698 NormSegmentSize sender parameter defines the maximum size (in bytes) 2699 of the "payload_data" field containing the content (a "segment"). 2700 The FEC encoding type and associated parameters govern the source 2701 block size (number of source symbols per coding block, etc.). NORM 2702 senders and receivers use these FEC parameters, along with the 2703 NormSegmentSize and transport object size to compute the source block 2704 structure for transport objects. These parameters are provided in 2705 the FEC Object Transmission Information for each object. The block 2706 partitioning algorithm described in the FEC Building Block [RFC5052] 2707 is RECOMMENDED for use to compute a source block structure such that 2708 all source blocks are as close to being equal length as possible. 2709 This helps avoid the performance disadvantages of "short" FEC blocks. 2710 Note this algorithm applies only to the statically-sized 2711 "NORM_OBJECT_DATA" and "NORM_OBJECT_FILE" transport object types 2712 where the object size is fixed and predetermined. For 2713 "NORM_OBJECT_STREAM" objects, the object is segmented according to 2714 the maximum source block length given in the FEC Transmission 2715 Information, unless the FEC Payload ID indicates an alternative size 2716 for a given block. 2718 5.2. Receiver Initialization and Reception 2720 For typical operation, NORM receivers will join a specified multicast 2721 group and listen on an specific port number for sender transmissions. 2722 As the NORM receiver receives "NORM_DATA" messages it will establish 2723 buffering state and provide content to its application as appropriate 2724 for the given data type. The NORM protocol allows receivers to join 2725 and leave the group at will although some applications might need 2726 receivers to be members of the group prior to start of data 2727 transmission. Thus, different NORM applications MAY use different 2728 policies to constrain the impact of new receivers joining the group 2729 in the middle of a session. For example, a useful implementation 2730 policy is for new receivers joining the group to limit or avoid 2731 repair requests for transport objects already in progress. The NORM 2732 sender implementation MAY impose additional constraints to limit the 2733 ability of receivers to disrupt reliable multicast performance by 2734 joining, leaving, and rejoining the group often. Different receiver 2735 "join policies" might be appropriate for different applications 2736 and/or scenarios. For general purpose operation, a default policy 2737 where receivers are allowed to request repair only for coding blocks 2738 with a NormTransportId and FEC coding block number greater than or 2739 equal to the first non-repair "NORM_DATA" or "NORM_INFO" message 2740 received upon joining the group is RECOMMENDED. For objects of type 2741 "NORM_OBJECT_STREAM" it is RECOMMENDED the join policy constrain 2742 receivers to start reliable reception at the current FEC coding block 2743 for which non-repair content is received. 2745 In some deployments, different multicast receivers might have 2746 differing quality of network connectivity. Some receivers may suffer 2747 significantly poorer performance with very limited goodput due to low 2748 connection rate or substantial packet loss. Similar to the "join 2749 policies" described above, a NORM sender implementation MAY choose to 2750 enforce different "service policies" to perhaps exclude exceptionally 2751 poor-performing (or otherwise badly-behaving) receivers from the 2752 group. The sender implementation could choose to ignore NACKs from 2753 such receivers and/or force advancement of its logical "repair 2754 window" (i.e. Enforcing a minimal level of service) and use the 2755 "NORM_CMD(SQUELCH)" message to advise those poor performers of its 2756 advance. Note in some cases, the application may need to support the 2757 "weakest member" regardless of the time needed to achieve reliable 2758 delivery. When implemented, the protocol instantiation SHOULD expose 2759 controls to the set of "join" and/or "service" policies available to 2760 support the needs of different applications. 2762 5.3. Receiver NACK Procedure 2764 When the receiver detects it is missing data from a sender's NORM 2765 transmissions, it initiates its NACKing procedure. The NACKing 2766 procedure SHALL be initiated only at FEC coding block boundaries, 2767 NormObject boundaries, upon receipt of a "NORM_CMD(FLUSH)" message, 2768 or upon an "inactivity" timeout when "NORM_DATA" or "NORM_INFO" 2769 transmissions are no longer received from a previously active sender. 2770 The RECOMMENDED value of such an inactivity timeout is: 2771 T_inactivity = NORM_ROBUST_FACTOR * 2 * GRTT_sender 2773 where the ""GRTT_sender"" value corresponds to the GRTT estimate 2774 advertised in the "grtt" field of NORM sender messages. A minimum 2775 ""T_inactivity"" value of 1 second is RECOMMENDED. The NORM receiver 2776 SHOULD reset this inactivity timer and repeat NACK initiation upon 2777 timeout for up to "NORM_ROBUST_FACTOR" times or more depending upon 2778 the application's need for persistence by its receivers. It is also 2779 important receivers rescale the ""T_inactivity"" timeout as the 2780 sender's advertised GRTT changes. 2782 The NACKing procedure begins with a random backoff timeout. The 2783 duration of the backoff timeout is chosen using the "RandomBackoff" 2784 algorithm described in the Multicast NACK Building Block [RFC5401] 2785 using ("K_sender*GRTT_sender") for the "maxTime" parameter and the 2786 sender advertised group size ("GSIZE_sender") as the "groupSize" 2787 parameter. NORM senders provide values for "GRTT_sender", "K_sender" 2788 and "GSIZE_sender" via the "grtt", "backoff", and "gsize" fields of 2789 transmitted messages. The "GRTT_sender" value is determined by the 2790 sender based on feedback it has received from the group while the 2791 "K_sender" and "GSIZE_sender" values can be determined by application 2792 requirements and expectations or ancillary information. The backoff 2793 factor ""K_sender"" MUST be greater than "one" to provide for 2794 effective feedback suppression. A value of "K_sender = 4" is 2795 RECOMMENDED for the Any Source Multicast (ASM) model while a value of 2796 "K_sender = 6" is RECOMMENDED for Single Source Multicast (SSM) 2797 operation. 2799 Thus: 2800 T_backoff = RandomBackoff(K_sender*GRTT_sender, GSIZE_sender) 2802 To avoid the possibility of NACK implosion in the case of sender or 2803 network failure during SSM operation, the receiver SHALL 2804 automatically suppress its NACK and immediately enter the "holdoff" 2805 period described below when "T_backoff" is greater than 2806 "(K_sender-1)*GRTT_sender". Otherwise, the backoff period is entered 2807 and the receiver MUST accumulate external pending repair state from 2808 "NORM_NACK" messages and "NORM_CMD(REPAIR_ADV)" messages received. 2809 At the end of the backoff time, the receiver SHALL generate a 2810 "NORM_NACK" message only if the following conditions are met: 2812 1. The sender's current transmit position (in terms of 2813 objectTransportId::fecPayloadId) exceeds the earliest repair 2814 position of the receiver. 2816 2. The repair state accumulated from "NORM_NACK" and 2817 "NORM_CMD(REPAIR_ADV)" messages do not equal or supersede the 2818 receiver's repair needs up to the sender transmission position at 2819 the time the NACK procedure (backoff timeout) was initiated. 2821 If these conditions are met, the receiver immediately generates a 2822 "NORM_NACK" message when the backoff timeout expires. Otherwise, the 2823 receiver's NACK is considered to be "suppressed" and the message is 2824 not sent. At this time, the receiver begins a "holdoff" period 2825 during which it constrains itself to not re-initiate the NACKing 2826 process. The purpose of this timeout is to allow the sender worst- 2827 case time to respond to the repair needs before the receiver requests 2828 repair again. The value of this "holdoff" timeout ("T_rcvrHoldoff") 2829 as described in [RFC5401] is: 2830 T_rcvrHoldoff =(K_sender+2)*GRTT_sender 2832 The "NORM_NACK" message contains repair request content beginning 2833 with lowest ordinal repair position of the receiver up through the 2834 coding block prior to the most recently heard ordinal transmission 2835 position for the sender. If the size of the "NORM_NACK" content 2836 exceeds the sender's NormSegmentSize, the NACK content is truncated 2837 so the receiver only generates a single "NORM_NACK" message per NACK 2838 cycle for a given sender. In summary, a single NACK message is 2839 generated containing the receiver's lowest ordinal repair needs. 2841 For each partially-received FEC coding block requiring repair, the 2842 receiver SHALL, on its FIRST repair attempt for the block, request 2843 the parity portion of the FEC coding block beginning with the lowest 2844 ordinal parity "encoding_symbol_id" (i.e., "encoding_symbol_id" = 2845 "source_block_len") and request the number of FEC symbols 2846 corresponding to its data segment erasure count for the block. On 2847 subsequent repair cycles for the same coding block, the receiver 2848 SHALL request only those repair symbols from the first set it has not 2849 yet received up to the remaining erasure count for that applicable 2850 coding block. Note the sender might have transmitted other 2851 different, additional parity segments for other receivers that could 2852 also be used to satisfy the local receiver's erasure-filling needs. 2853 In the case where the erasure count for a partially-received FEC 2854 coding block exceeds the maximum number of parity symbols available 2855 from the sender for the block (as indicated by the "NORM_DATA" 2856 "fec_num_parity" field), the receiver SHALL request all available 2857 parity segments plus the ordinally highest missing data segments 2858 needed to satisfy its total erasure needs for the block. The goal of 2859 this strategy is for the overall receiver set to request a lowest 2860 common denominator set of repair symbols for a given FEC coding 2861 block. This allows the sender to construct the most efficient repair 2862 transmission segment set and enables effective NACK suppression among 2863 the receivers even with uncorrelated packet loss. This approach also 2864 does not demand synchronization among the receiver set in their 2865 repair requests for the sender. 2867 For FEC coding blocks or NormObjects missed in their entirety, the 2868 NORM receiver constructs repair requests with "NORM_NACK_BLOCK" or 2869 "NORM_NACK_OBJECT" flags set as appropriate. The request for 2870 retransmission of "NORM_INFO" is accomplished by setting the 2871 "NORM_NACK_INFO" flag in a corresponding repair request. 2873 5.4. Sender NACK Processing and Response 2875 The principle goal of the sender is to make forward progress in the 2876 transmission of data its application has enqueued. However, the 2877 sender will need to occasionally "rewind" its logical transmission 2878 point to satisfy the repair needs of receivers who have NACKed. 2879 Aggregation of multiple NACKs is used to determine an optimal repair 2880 strategy when a NACK event occurs. Since receivers initiate the NACK 2881 process on coding block or object boundaries, there is some loose 2882 degree of synchronization of the repair process even when receivers 2883 experience uncorrelated data loss. 2885 5.4.1. Sender Repair State Aggregation 2887 When a sender is in its normal state of transmitting new data and 2888 receives a NACK, it begins a procedure to accumulate NACK repair 2889 state from "NORM_NACK" messages before beginning repair 2890 transmissions. Note this period of aggregating repair state does NOT 2891 interfere with its ongoing transmission of new data. 2893 As described in [RFC5401], the period of time during which the sender 2894 aggregates "NORM_NACK" messages is equal to: 2895 T_sndrAggregate = (K_sender + 1) * GRTT_sender 2897 where ""K_sender"" is the backoff scaling value advertised to the 2898 receivers, and "GRTT_sender" is the sender's current estimate of the 2899 group's greatest round-trip time. Note, for NORM unicast sessions, 2900 the ""T_sndrAggregate"" time can be set to "ZERO" since there is only 2901 one receiver. Similarly, the ""K_sender"" value SHOULD be set to 2902 "ZERO" for NORM unicast sessions to minimize repair latency. 2904 When this period ends, the sender "rewinds" by incorporating the 2905 accumulated repair state into its pending transmission state and 2906 begins transmitting repair messages. After pending repair 2907 transmissions are completed, the sender continues with new 2908 transmissions of any enqueued data. Also, at this point in time, the 2909 sender begins a "holdoff" timeout during which time the sender 2910 constrains itself from initiating a new repair aggregation cycle, 2911 even if "NORM_NACK" messages arrive. As described in [RFC5401], the 2912 value of this sender "holdoff" period is: 2913 T_sndrHoldoff = (1 * GRTT_sender) 2915 If additional "NORM_NACK" messages are received during this sender 2916 "holdoff" period, the sender will immediately incorporate these late- 2917 arriving messages into its pending transmission state if, and only 2918 if, the NACK content is ordinally greater than the sender's current 2919 transmission position. This "holdoff" time allows worst case time 2920 for the sender to propagate its current transmission sequence 2921 position to the group, thus avoiding redundant repair transmissions. 2922 After the holdoff timeout expires, a new NACK accumulation period can 2923 be begun (upon arrival of a NACK) in concert with the pending repair 2924 and new data transmission. Recall receivers are not to initiate the 2925 NACK repair process until the sender's logical transmission position 2926 exceeds the lowest ordinal position of their repair needs. With the 2927 new NACK aggregation period, the sender repeats the same process of 2928 incorporating accumulated repair state into its transmission plan and 2929 subsequently "rewinding" to transmit the lowest ordinal repair data 2930 when the aggregation period expires. Again, this is conducted in 2931 concert with ongoing new data and/or pending repair transmissions. 2933 5.4.2. Sender FEC Repair Transmission Strategy 2935 The NORM sender SHOULD leverage transmission of FEC parity content 2936 for repair to the greatest extent possible. Recall that receivers 2937 use a strategy to request a lowest common denominator of explicit 2938 repair (including parity content) in the formation of their 2939 "NORM_NACK" messages. Before falling back to explicitly satisfying 2940 different receivers' repair needs, the sender can make use of the 2941 general erasure-filling capability of FEC-generated parity segments. 2942 The sender can determine the maximum erasure filling needs for 2943 individual FEC coding blocks from the "NORM_NACK" messages received 2944 during the repair aggregation period. Then, if the sender has a 2945 sufficient number (less than or equal to the maximum erasure count) 2946 of previously unsent parity segments available for the applicable 2947 coding blocks, the sender can transmit these in lieu of the specific 2948 packets the receiver set has requested. The sender SHOULD NOT resort 2949 to explicit transmission of the receiver set's repair needs until 2950 after exhausting its supply of "fresh" (unsent) parity segments for a 2951 given coding block. In general, if a sufficiently powerful FEC code 2952 is used, the need for explicit repair will be an exception, and the 2953 fulfillment of reliable multicast can be accomplished quite 2954 efficiently. However, the ability to resort to explicit repair 2955 allows the protocol to be continue to operate under even very extreme 2956 circumstances. 2958 "NORM_DATA" messages sent as repair transmissions SHALL be flagged 2959 with the "NORM_FLAG_REPAIR" flag. This allows receivers to obey any 2960 policies limiting new receivers from joining the reliable 2961 transmission when only repair transmissions have been received. 2962 Additionally, the sender SHOULD additionally flag "NORM_DATA" 2963 transmissions sent as explicit repair with the "NORM_FLAG_EXPLICIT" 2964 flag. 2966 Although NORM end system receivers do not make use of the 2967 "NORM_FLAG_EXPLICIT" flag, this message transmission status could be 2968 leveraged by intermediate systems wishing to "assist" NORM protocol 2969 performance. If such systems are properly positioned with respect to 2970 reciprocal reverse-path multicast routing, they need to sub-cast only 2971 a sufficient count of non-explicit parity repairs to satisfy a 2972 multicast routing sub-tree's erasure filling needs for a given FEC 2973 coding block. When the sender has resorted to explicit repair, then 2974 the intermediate systems SHOULD sub-cast all of the explicit repair 2975 packets to those portions of the routing tree still requiring repair 2976 for a given coding block. Note the intermediate systems will need to 2977 conduct repair state accumulation for sub-routes in a manner similar 2978 to the sender's repair state accumulation in order to have sufficient 2979 information to perform the sub-casting. Additionally, the 2980 intermediate systems could perform additional "NORM_NACK" 2981 suppression/aggregation as it conducts this repair state accumulation 2982 for NORM repair cycles. The detail of this type of operation are 2983 beyond the scope of this document, but this information is provided 2984 for possible future consideration. 2986 5.4.3. Sender NORM_CMD(SQUELCH) Generation 2988 If the sender receives a "NORM_NACK" message for repair of data it is 2989 no longer supporting, the sender generates a "NORM_CMD(SQUELCH)" 2990 message to advertise its repair window and squelch any receivers from 2991 additional NACKing of invalid data. The transmission rate of 2992 "NORM_CMD(SQUELCH)" messages is limited to once per "2*GRTT_sender". 2993 The "invalid_object_list" (if applicable) of the "NORM_CMD(SQUELCH)" 2994 message SHALL begin with the lowest "object_transport_id" from the 2995 invalid "NORM_NACK" messages received since the last 2996 "NORM_CMD(SQUELCH)" transmission. The list includes as many lower 2997 ordinal invalid "object_transport_ids" that can fit for the 2998 "NORM_CMD(SQUELCH)" payload size to less than or equal to the 2999 sender's NormSegmentSize parameter. 3001 5.4.4. Sender NORM_CMD(REPAIR_ADV) Generation 3003 When a NORM sender receives "NORM_NACK" messages from receivers via 3004 unicast transmission, it uses "NORM_CMD(REPAIR_ADV)" messages to 3005 advertise its accumulated repair state to the receiver set since the 3006 receiver set is not directly sharing their repair needs via multicast 3007 communication. A NORM sender implementation MAY use a separate port 3008 number from the NormSession port number as the source port for its 3009 transmissions. Thus NORM receivers can direct any unicast feedback 3010 messages to this separate sender port number, distinct from the NORM 3011 session (or destination) port number. Then, the NORM sender 3012 implementation can discriminate unicast feedback messages from 3013 multicast feedback messages when there is a mix of multicast and 3014 unicast feedback receivers. The "NORM_CMD(REPAIR_ADV)" message is 3015 multicast to the receiver set by the sender. The payload portion of 3016 this message has content in the same format as the "NORM_NACK" 3017 receiver message payload. Receivers are then able to perform 3018 feedback suppression in the same manner as with "NORM_NACK" messages 3019 directly received from other receivers. Note the sender does not 3020 merely retransmit NACK content it receives, but instead transmits a 3021 representation of its aggregated repair state. The transmission of 3022 "NORM_CMD(REPAIR_ADV)" messages are subject to the sender transmit 3023 rate limit and NormSegmentSize limitation. When the 3024 "NORM_CMD(REPAIR_ADV)" message is of maximum size, receivers SHALL 3025 consider the maximum ordinal transmission position value embedded in 3026 the message as the senders current transmission position and 3027 implicitly suppress requests for ordinally higher repair. For 3028 congestion control operation, the sender will also need to provide 3029 any information needed so dynamic congestion control feedback can be 3030 suppressed among receivers. This document specifies the NORM-CC 3031 Feedback Header Extension that is applied for baseline NORM-CC 3032 operation. If other congestion control mechanisms are used within a 3033 NORM implementation, other header extensions MAY be defined. 3034 Whatever content format is used for this purpose SHOULD ensure that 3035 maximum possible suppression state is conveyed to the receiver set. 3037 5.5. Additional Protocol Mechanisms 3039 In addition to the principal function of data content transmission 3040 and repair, there are some other protocol mechanisms to help NORM to 3041 adapt to network conditions and play fairly with other coexistent 3042 protocols. 3044 5.5.1. Group Round-trip Time (GRTT) Collection 3046 For NORM receivers to appropriately scale backoff timeouts and the 3047 senders to use proper corresponding timeouts, the participants need 3048 to use a common timeout basis. Each NORM sender monitors the round- 3049 trip time of active receivers and determines the greatest group 3050 round-trip time. The sender advertises this GRTT estimate in every 3051 message it transmits so receivers have this value available for 3052 scaling their timers. To measure the current GRTT, the sender 3053 periodically sends "NORM_CMD(CC)" messages containing a locally 3054 generated timestamp. Receivers are expected to record this timestamp 3055 along with the time the "NORM_CMD(CC)" message is received. Then, 3056 when the receivers generate feedback messages to the sender, an 3057 adjusted version of the sender timestamp is embedded in the feedback 3058 message ("NORM_NACK" or "NORM_ACK"). The adjustment adds the amount 3059 of time the receiver held the timestamp before generating its 3060 response. Upon receipt of this adjusted timestamp, the sender is 3061 able to calculate the round-trip time to that receiver. 3063 The round-trip time for each receiver is fed into an algorithm that 3064 weights and smoothes the values for a conservative estimate of the 3065 GRTT. The algorithm and methodology are described in the Multicast 3066 NACK Building Block [RFC5401] in the section entitled "One-to-Many 3067 Sender GRTT Measurement". A conservative estimate helps guarantee 3068 feedback suppression at a small cost in overall protocol repair 3069 delay. The sender's current estimate of GRTT is advertised in the 3070 "grtt" field found in all NORM sender messages. The advertised GRTT 3071 is also limited to a minimum of the nominal inter-packet transmission 3072 time given the sender's current transmission rate and system clock 3073 granularity. The reason for this additional limit is to keep the 3074 receiver somewhat event-driven by making sure the sender has had 3075 adequate time to generate any response to repair requests from 3076 receivers given transmit rate limitations due to congestion control 3077 or configuration. 3079 When the NORM-CC Rate header extension is present in "NORM_CMD(CC)" 3080 messages, the receivers respond to "NORM_CMD(CC)" messages as 3081 described in Section 5.5.2, "NORM Congestion Control Operation". The 3082 "NORM_CMD(CC)" messages are periodically generated by the sender as 3083 described for congestion control operation. This provides for 3084 proactive, but controlled, feedback from the group in the form of 3085 "NORM_ACK" messages. This provides for GRTT feedback even if no 3086 "NORM_NACK" messages are being sent. If operating without congestion 3087 control in a closed network, the "NORM_CMD(CC)" messages MAY be sent 3088 periodically without the NORM-CC Rate header extension. In this 3089 case, receivers will only provide GRTT measurement feedback when 3090 "NORM_NACK" messages are generated since no "NORM_ACK" messages are 3091 generated. In this case, the "NORM_CMD(CC)" messages MAY be sent 3092 less frequently, perhaps as little as once per minute, to conserve 3093 network capacity. Note the NORM-CC Rate header extension MAY also be 3094 used to proactively solicit RTT feedback from the receiver group per 3095 congestion control operation even when the sender is not conducting 3096 congestion control rate adjustment. NORM operation without 3097 congestion control SHOULD be considered only in closed networks. 3099 5.5.2. NORM Congestion Control Operation 3101 This section describes baseline congestion control operation for the 3102 NORM protocol (NORM-CC). The supporting NORM message formats and 3103 approach described here are an adaptation of the equation-based TCP- 3104 Friendly Multicast Congestion Control (TFMCC) approach[RFC4654]. 3105 This congestion control scheme is REQUIRED for operation within the 3106 general Internet unless the NORM implementation is adapted to use 3107 another IETF-sanctioned reliable multicast congestion control 3108 mechanism. With this TFMCC-based approach, the transmissions of NORM 3109 senders are controlled in a rate-based manner as opposed to window- 3110 based congestion control algorithms as in TCP. However, it is 3111 possible the NORM protocol message set MAY alternatively be used to 3112 support a window-based multicast congestion control scheme such as 3113 PGMCC. The details of such an alternative MAY be described 3114 separately or in a future revision of this document. In either case 3115 (rate-based TFMCC or window-based PGMCC), successful control of 3116 sender transmission depends upon collection of sender-to-receiver 3117 packet loss estimates and RTTs to identify the congestion control 3118 bottleneck path(s) within the multicast topology and adjust the 3119 sender rate accordingly. The receiver with loss and RTT estimates 3120 corresponding to the lowest resulting calculated transmission rate is 3121 identified as the "current limiting receiver" (CLR). In the case of 3122 a tie (where candidate CLRs are within 10% of the same calculated 3123 rate), the receiver with the largest RTT value SHOULD be designated 3124 as the CLR. 3126 As described in [TcpModel], a steady-state sender transmission rate, 3127 to be "friendly" with competing TCP flows can be calculated as: 3128 S 3129 Rsender = ---------------------------------------------------------- 3130 T_rtt*(sqrt((2/3)*p) + 12*sqrt((3/8)*p) * p * (1 + 32*(p^2))) 3132 where 3134 "S" = nominal transmitted packet size. (In NORM, the "nominal" 3135 packet size can be determined by the sender as an exponentially 3136 weighted moving average (EWMA) of transmitted packet sizes to account 3137 for variable message sizes). 3139 "T_rtt" = RTT estimate of the current "current limiting receiver" 3140 (CLR). 3142 "p" = loss event fraction of the CLR. 3144 To support congestion control feedback collection and operation, the 3145 NORM sender periodically transmits "NORM_CMD(CC)" command messages. 3146 "NORM_CMD(CC)" messages are multiplexed with NORM data and repair 3147 transmissions and serve several purposes: 3149 1. Stimulate explicit feedback from the general receiver set to 3150 collect congestion control information. 3152 2. Communicate state to the receiver set on the sender's current 3153 congestion control status including details of the CLR. 3155 3. Initiate rapid (immediate) feedback from the CLR in order to 3156 closely track the dynamics of congestion control for the current 3157 worst path in the group multicast topology. 3159 The format of the "NORM_CMD(CC)" message is described in 3160 Section 4.2.3 of this document. The "NORM_CMD(CC)" message contains 3161 information to allow measurement of RTTs, to inform the group of the 3162 congestion control CLR, and to provide feedback of individual RTT 3163 measurements to the receivers in the group. The "NORM_CMD(CC)" also 3164 provides for exciting feedback from OPTIONAL "potential limiting 3165 receiver" (PLR) nodes that might be determined administratively or 3166 possibly algorithmically based upon congestion control feedback. PLR 3167 nodes are receivers that have been identified to have potential for 3168 (perhaps soon) becoming the CLR and thus immediate, up-to-date 3169 feedback is beneficial for congestion control performance. The PLR 3170 list MAY be populated with a small number of receivers the sender 3171 identifies as approaching the CLR loss and delay conditions based on 3172 feedback from the group. 3174 5.5.2.1. NORM_CMD(CC) Transmission 3176 The "NORM_CMD(CC)" message is transmitted periodically by the sender 3177 along with its normal data transmission. Note the repeated 3178 transmission of "NORM_CMD(CC)" messages MAY be initiated some time 3179 before transmission of user data content at session startup. This 3180 can be done to collect some estimation of the current state of the 3181 multicast topology with respect to group and individual RTT and 3182 congestion control state. 3184 A "NORM_CMD(CC)" message is immediately transmitted at sender 3185 startup. The interval of subsequent "NORM_CMD(CC)" message 3186 transmission is determined as follows: 3188 1. By default, the interval is set according to the current sender 3189 GRTT estimate. A startup initial value of "GRTT_sender = 0.5" 3190 seconds is RECOMMENDED when no feedback has yet been received 3191 from the group. 3193 2. Until a CLR has been identified (based on previous receiver 3194 feedback) or when no data transmission is pending, the 3195 "NORM_CMD(CC)" interval is doubled up from its current interval 3196 to a maximum of once per 30 seconds. This results in a low duty 3197 cycle for "NORM_CMD(CC)" probing when no CLR is identified or 3198 there is no pending data to transmit. 3200 3. When a CLR has been identified (based on receiver feedback) and 3201 data transmission is pending, the probing interval is set to the 3202 RTT between the sender and the CLR ("RTT_clr"). 3204 4. Additionally, when the data transmission rate is low with respect 3205 to the "RTT_clr" interval used for probing, the implementation 3206 SHOULD ensure no more than one "NORM_CMD(CC)" message is sent per 3207 "NORM_DATA" message when there is data pending transmission. 3208 This ensures the transmission of this control message is not done 3209 to the exclusion of user data transmission. 3211 The "NORM_CMD(CC)" "cc_sequence" field is incremented with each 3212 transmission of a "NORM_CMD(CC)" command. The greatest "cc_sequence" 3213 recently received by receivers is included in their feedback to the 3214 sender. This allows the sender to determine the age of feedback to 3215 assist in congestion avoidance. 3217 The NORM-CC Rate Header Extension is applied to the "NORM_CMD(CC)" 3218 message and the sender advertises its current transmission rate in 3219 the "send_rate" field. The rate information is used by receivers to 3220 initialize loss estimation during congestion control startup or 3221 restart. 3223 The "cc_node_list" contains a list of entries identifying receivers 3224 and their current congestion control state (status "flags", "rtt" and 3225 "loss" estimates). The list will be empty if the sender has not yet 3226 received any feedback from the group. If the sender has received 3227 feedback, the list will minimally contain an entry identifying the 3228 CLR. A "NORM_FLAG_CC_CLR" flag value is provided for the "cc_flags" 3229 field to identify the CLR entry. It is RECOMMENDED the CLR entry be 3230 the first in the list for implementation efficiency. Additional 3231 entries in the list are used to provide sender-measured individual 3232 RTT estimates to receivers in the group. The number of additional 3233 entries in this list is dependent upon the percentage of control 3234 traffic the sender application is willing to send with respect to 3235 user data message transmissions. More entries in the list will allow 3236 the sender to be more responsive to congestion control dynamics. The 3237 length of the list can be dynamically determined according to the 3238 current transmission rate and scheduling of "NORM_CMD(CC)" messages. 3239 The maximum length of the list corresponds to the sender's 3240 NormSegmentSize parameter for the session. The inclusion of 3241 additional entries in the list based on receiver feedback are 3242 prioritized with following rules: 3244 1. Receivers that have not yet been provided a RTT measurement get 3245 first priority. Of these, those with the greatest loss fraction 3246 receive precedence for list inclusion. 3248 2. Secondly, receivers that have previously been provided a RTT 3249 measurement are included with receivers yielding the lowest 3250 calculated congestion rate getting precedence. 3252 There are "cc_flag" values in addition to "NORM_FLAG_CC_CLR" used for 3253 other congestion control functions. The "NORM_FLAG_CC_PLR" flag 3254 value is used to mark additional receivers from which the sender 3255 would like to have immediate, non-suppressed feedback. These can be 3256 receivers the sender algorithmically identified as potential future 3257 CLRs or have been pre-configured as potential congestion control 3258 points in the network. The "NORM_FLAG_CC_RTT" indicates the validity 3259 of the "cc_rtt" field for the associated receiver node. Normally, 3260 this flag will be set since the receivers in the list will typically 3261 be receivers from which the sender has received feedback. However, 3262 in the case the NORM sender has been pre-configured with a set of PLR 3263 nodes, feedback from those receivers might not have yet been 3264 collected and thus the "cc_rtt" field does not contain a valid value 3265 when this flag is not set. Similarly, a value of "ZERO" for the 3266 "cc_rate" field here MUST be treated as an invalid value and be 3267 ignored for the purposes of feedback suppression, etc. 3269 5.5.2.2. NORM_CMD(CC) Feedback Response 3271 Receivers explicitly respond to "NORM_CMD(CC)" messages in the form 3272 of a "NORM_ACK(RTT)" message. The goal of the congestion control 3273 feedback is to determine the receivers with the lowest congestion 3274 control rates. Receivers marked as CLR or PLR nodes in the 3275 "NORM_CMD(CC)" "cc_node_list" immediately provide feedback in the 3276 form of a "NORM_ACK" to this message. When a "NORM_CMD(CC)" is 3277 received, non-CLR or non-PLR nodes initiate random feedback backoff 3278 timeouts similar to that used when the receiver initiates a repair 3279 cycle (see Section 5.3) in response to detection of data loss. The 3280 backoff timeout for the congestion control response is generated as 3281 follows: 3282 T_backoff = RandomBackoff(K_backoff * GRTT_sender, GSIZE_sender) 3284 The ""RandomBackoff()"" algorithm provides a truncated exponentially 3285 distributed random number and is described in the Multicast NACK 3286 Building Block [RFC5401]. The same backoff factor, "K_backoff = 3287 K_sender", as used with " NORM_NACK" suppression is generally 3288 RECOMMENDED. However, in cases where the application purposefully 3289 specifies a very small "K_sender" backoff factor to minimize the NACK 3290 repair process latency (trading off group size scalability), it is 3291 RECOMMENDED a larger backoff factor for congestion control feedback 3292 be maintained, since there can be a larger volume of congestion 3293 control feedback than NACKs in many cases and some congestion control 3294 feedback latency might be tolerable where reliable delivery latency 3295 is not. As previously noted, a backoff factor value of "K_sender = 3296 4" is generally RECOMMENDED for ASM operation and "K_sender = 6" for 3297 SSM operation. A receiver SHALL cancel the backoff timeout and thus 3298 its pending transmission of a "NORM_ACK(RTT)" message under the 3299 following conditions: 3301 1. The receiver generates another feedback message ("NORM_NACK" or 3302 other "NORM_ACK") before the congestion control feedback timeout 3303 expires (these messages will convey the current congestion 3304 control feedback information), 3306 2. A "NORM_CMD(CC)" or other receiver feedback with an ordinally 3307 greater "cc_sequence" field value is received before the 3308 congestion control feedback timeout expires (this is similar to 3309 the TFMCC feedback round number), 3311 3. When the "T_backoff" is greater than "1*GRTT_sender". This 3312 prevents NACK implosion in the event of sender or network 3313 failure, 3315 4. "Suppressing" congestion control feedback is heard from another 3316 receiver (in a "NORM_ACK" or "NORM_NACK") or via a 3317 "NORM_CMD(REPAIR_ADV)" message from the sender. The local 3318 receiver's feedback is "suppressed" if the rate of the competing 3319 feedback ("Rfb") is sufficiently close to or less than the local 3320 receiver's calculated rate ("Rcalc"). The local receiver's 3321 feedback is canceled when "Rcalc > (0.9 * Rfb)". Also note 3322 receivers that have not yet received an RTT measurement from the 3323 sender are suppressed only by other receivers that have not yet 3324 measured RTT. Additionally, receivers whose RTT estimate has 3325 aged considerably (i.e., they haven't been included in the 3326 "NORM_CMD(CC)" "cc_node_list" in a long time) might wish to 3327 compete as a receiver with no prior RTT measurement after some 3328 long term expiration period. 3330 When the backoff timer expires, the receiver SHALL generate a 3331 "NORM_ACK(RTT)" message to provide feedback to the sender and group. 3332 This message MAY be multicast to the group for most effective 3333 suppression in ASM topologies or unicast to the sender depending upon 3334 how the NORM protocol is deployed and configured. 3336 Whenever any feedback is generated (including this "NORM_ACK(RTT)" 3337 message), receivers include an adjusted version of the sender 3338 timestamp from the most recently received "NORM_CMD(CC)" message and 3339 its "cc_sequence" value in the corresponding "NORM_ACK" or 3340 "NORM_NACK" message fields. For NORM-CC operation, any generated 3341 feedback message SHALL also contain the NORM-CC Feedback header 3342 extension. The receiver provides its current "cc_rate" estimate, 3343 "cc_loss" estimate, "cc_rtt" if known, and any applicable "cc_flags" 3344 via this header extension. 3346 During slow start (when the receiver has not yet detected loss from 3347 the sender), the receiver uses a value equal to two times its 3348 measured rate from the sender in the "cc_rate" field. For steady- 3349 state congestion control operation, the receiver "cc_rate" value is 3350 from the equation-based value using its current loss event estimate 3351 and sender<->receiver RTT information. (The "GRTT_sender" is used 3352 when the receiver has not yet measured its individual RTT). 3354 The "cc_loss" field value reflects the receiver's current loss event 3355 estimate with respect to the sender in question. 3357 When the receiver has a valid individual RTT measurement, it SHALL 3358 include this value in the "cc_rtt" field. The "NORM_FLAG_CC_RTT" 3359 MUST be set when the "cc_rtt" field is valid. 3361 After a congestion control feedback message is generated or when the 3362 feedback is suppressed, a non-CLR receiver begins a "holdoff" timeout 3363 period during which it will restrain itself from providing congestion 3364 control feedback, even if "NORM_CMD(CC)" messages are received from 3365 the sender (unless the receive becomes marked as a CLR or PLR node). 3366 The value of this holdoff timeout ("T_ccHoldoff") period is: 3367 T_ccHoldoff = (K_sender * GRTT_sender) 3369 Thus, non-CLR receivers are constrained to providing explicit 3370 congestion control feedback once per "K_sender*GRTT_sender" 3371 intervals. However, as the session progresses, different receivers 3372 will be responding to different "NORM_CMD(CC)" messages and there 3373 will be relatively continuous feedback of congestion control 3374 information while the sender is active. 3376 5.5.2.3. Congestion Control Rate Adjustment 3378 During steady-state operation, the sender will directly adjust its 3379 transmission rate to the rate indicated by the feedback from its 3380 currently selected CLR. As noted in [TfmccPaper], the estimation of 3381 parameters (loss and RTT) for the CLR will generally constrain the 3382 rate changes possible within acceptable bounds. For rate increases, 3383 the sender SHALL observe a maximum rate of increase of one packet per 3384 RTT at all times during steady-state operation. 3386 The sender processes congestion control feedback from the receivers 3387 and selects the CLR based on the lowest rate receiver. Receiver 3388 rates are either determined directly from the slow start "cc_rate" 3389 provided by the receiver in the NORM-CC Feedback header extension or 3390 by performing the equation-based calculation using individual RTT and 3391 loss estimates ("cc_loss") as feedback is received. 3393 The sender can calculate a current RTT for a receiver ("RTT_rcvrNew") 3394 using the "grtt_response" timestamp included in feedback messages. 3395 When the "cc_rtt" value in a response is not valid, the sender simply 3396 uses this "RTT_rcvrNew" value as the receiver's current RTT 3397 ("RTT_rcvr"). For non-CLR and non-PLR receivers, the sender can use 3398 the "cc_rtt" value provided in the NORM-CC Feedback header extension 3399 as the receiver's previous RTT measurement ("RTT_rcvrPrev") to smooth 3400 according to: 3401 RTT_rcvr = 0.5 * RTT_rcvrPrev + 0.5 * RTT_rcvrNew 3403 For CLR receivers where feedback is received more regularly, the 3404 sender SHOULD maintain a more smoothed RTT estimate upon new feedback 3405 from the CLR where: 3406 RTT_clr = 0.9 * RTT_clr + 0.1 * RTT_clrNew 3408 ""RTT_clrNew"" is the new RTT calculated from the timestamp in the 3409 feedback message received from the CLR. The "RTT_clr" is initialized 3410 to "RTT_clrNew" on the first feedback message received. Note the 3411 same procedure is observed by the sender for PLR receivers, and if a 3412 PLR is "promoted" to CLR status, the smoothed estimate can be 3413 continued. 3415 There are some additional periods besides steady-state operation to 3416 be considered in NORM-CC operation. These periods are: 3418 1. during session startup, 3420 2. when no feedback is received from the CLR, and 3422 3. when the sender has a break in data transmission. 3424 During session startup, the congestion control operation SHALL 3425 observe a "slow start" procedure to quickly approach its fair 3426 bandwidth share. An initial sender startup rate is assumed where: 3427 Rinit = MIN(NormSegmentSize/GRTT_sender, NormSegmentSize) bytes/sec 3429 The rate is increased only when feedback is received from the 3430 receiver set. The "slow start" phase proceeds until any receiver 3431 provides feedback indicating loss has occurred. Rate increase during 3432 slow start is applied as: 3433 Rnew = Rrecv_min 3435 where "Rrecv_min" is the minimum reported receiver rate in the 3436 "cc_rate" field of congestion control feedback messages received from 3437 the group. Note during slow start, receivers use two times their 3438 measured rate from the sender in the "cc_rate" field of their 3439 feedback. Rate increase adjustment is limited to once per GRTT 3440 during slow start. 3442 If the CLR or any receiver intends to leave the group, it will set 3443 the "NORM_FLAG_CC_LEAVE" in its congestion control feedback message 3444 as an indication the sender SHOULD NOT select it as the CLR. When 3445 the CLR changes to a lower rate receiver, the sender SHOULD 3446 immediately adjust to the new lower rate. The sender is limited to 3447 increasing its rate at one additional packet per RTT towards any new, 3448 higher CLR rate. 3450 The sender SHOULD also track the age of the feedback it has received 3451 from the CLR by comparing its current "cc_sequence" value 3452 ("Seq_sender") to the last "cc_sequence" value received from the CLR 3453 ("Seq_clr"). As the age of the CLR feedback increases with no new 3454 feedback, the sender SHALL begin reducing its rate once per "RTT_clr" 3455 as a congestion avoidance measure. The following algorithm is used 3456 to determine the decrease in sender rate (Rsender bytes/sec) as the 3457 CLR feedback, unexpectedly, excessively ages: 3458 Age = Seq_sender - Seq_clr; 3459 if (Age > 4) Rsender = Rsender * 0.5; 3461 This rate reduction is limited to the lower bound on NORM 3462 transmission rate. After "NORM_ROBUST_FACTOR" consecutive 3463 "NORM_CMD(CC)" rounds without any feedback from the CLR, the sender 3464 SHOULD assume the CLR has left the group and pick the receiver with 3465 the next lowest rate as the new CLR. Note this assumes the sender 3466 does not have explicit knowledge the CLR intentionally left the 3467 group. If no receiver feedback is received, the sender MAY wish to 3468 withhold further transmissions of "NORM_DATA" segments and maintain 3469 "NORM_CMD(CC)" transmissions only until feedback is detected. After 3470 such a CLR timeout, the sender will be transmitting with a minimal 3471 rate and SHOULD return to slow start as described here for a break in 3472 data transmission. 3474 When the sender has a break in its data transmission, it can continue 3475 to probe the group with "NORM_CMD(CC)" messages to maintain RTT 3476 collection from the group. This will enable the sender to quickly 3477 determine an appropriate CLR upon data transmission restart. 3478 However, the sender SHOULD exponentially reduce its target rate to be 3479 used for transmission restart as time since the break elapses. The 3480 target rate SHOULD be recalculated once per "RTT_clr" as: 3481 Rsender = Rsender * 0.5; 3483 If the minimum NORM rate is reached, the sender SHOULD set the 3484 "NORM_FLAG_START" flag in its "NORM_CMD(CC)" messages upon restart 3485 and the group SHOULD observe slow start congestion control procedures 3486 until any receiver experiences a new loss event. 3488 5.5.3. NORM Positive Acknowledgment Procedure 3490 NORM provides options for the source application to request positive 3491 acknowledgment (ACK) of "NORM_CMD(FLUSH)" and "NORM_CMD(ACK_REQ)" 3492 messages from members of the group. There are some specific 3493 acknowledgment requests defined for the NORM protocol and a range of 3494 acknowledgment request types left to be defined by the application. 3495 One predefined acknowledgment type is the "NORM_ACK_FLUSH" type. 3496 This acknowledgment is used to determine if receivers have achieved 3497 completion of reliable reception up through a specific logical 3498 transmission point with respect to the sender's sequence of 3499 transmission. The "NORM_ACK_FLUSH" acknowledgment MAY be used to 3500 assist in application flow control when the sender has information on 3501 a portion of the receiver set. Another predefined acknowledgment 3502 type is "NORM_ACK(CC)" used to explicitly provide congestion control 3503 feedback in response to "NORM_CMD(CC)" messages transmitted by the 3504 sender for NORM-CC operation. Note the "NORM_ACK(CC)" response does 3505 NOT follow the positive acknowledgment procedure described here. The 3506 "NORM_CMD(ACK_REQ)" and "NORM_ACK" messages contain an "ack_type" 3507 field to identify the type of acknowledgment requested and provided. 3508 A range of "ack_type" values is provided for application-defined use. 3509 While the application is responsible for initiating the 3510 acknowledgment request and interprets application-defined "ack_type" 3511 values, the acknowledgment procedure SHOULD be conducted within the 3512 protocol implementation to take advantage of timing and transmission 3513 scheduling information available to the NORM transport. 3515 The NORM positive acknowledgment procedure uses polling by the sender 3516 to query the receiver group for response. Note this polling 3517 procedure is not intended to scale to very large receiver groups, but 3518 could be used in large group setting to query a critical subset of 3519 the group. Either the "NORM_CMD(ACK_REQ)", or when applicable, the 3520 "NORM_CMD(FLUSH)" message is used for polling and contains a list of 3521 NormNodeIds of the receivers expected to respond to the command. The 3522 list of receivers providing acknowledgment is determined by the 3523 source application with a priori knowledge of participating nodes or 3524 via some other application-level mechanism. 3526 The ACK process is initiated by the sender generating 3527 "NORM_CMD(FLUSH)" or "NORM_CMD(ACK_REQ)" messages in periodic rounds. 3528 For "NORM_ACK_FLUSH" requests, the "NORM_CMD(FLUSH)" contain a 3529 "object_transport_id" and "fec_payload_id" denoting the watermark 3530 transmission point for which acknowledgment is requested. This 3531 watermark transmission point is echoed in the corresponding fields of 3532 the "NORM_ACK(FLUSH)" message sent by the receiver in response. 3533 "NORM_CMD(ACK_REQ)" messages contain an "ack_id" field that is 3534 similarly echoed in response so the sender can match the response to 3535 the appropriate request. 3537 In response to the "NORM_CMD(ACK_REQ)", the listed receivers 3538 randomly, with a uniform distribution, transmit "NORM_ACK" messages 3539 over a time window of ("1*GRTT_sender"). These "NORM_ACK" messages 3540 are typically unicast to the sender. (Note "NORM_ACK(CC)" messages 3541 SHALL be multicast or unicast in the same manner as "NORM_NACK" 3542 messages). 3544 The ACK process is self-limiting and avoids ACK implosion because: 3546 1. Only a single "NORM_CMD(ACK_REQ)" message is generated once per 3547 ("2*GRTT_sender"), and, 3549 2. The size of the "acking_node_list" of NormNodeIds from which 3550 acknowledgment is requested is limited to a maximum of the sender 3551 NormSegmentSize setting per round of the positive acknowledgment 3552 process. 3554 Because the size of the included list is limited to the sender's 3555 NormSegmentSize setting, multiple "NORM_CMD(ACK_REQ)" rounds will 3556 sometimes be necessary to achieve responses from all receivers 3557 specified. The content of the attached NormNodeId list will be 3558 dynamically updated as this process progresses and "NORM_ACK" 3559 responses are received from the specified receiver set. As the 3560 sender receives valid responses (i.e., matching watermark point or 3561 "ack_id") from receivers, it SHALL eliminate those receivers from the 3562 subsequent "NORM_CMD(ACK_REQ)" message "acking_node_list" and add in 3563 any pending receiver NormNodeIds while keeping within the 3564 NormSegmentSize limitation of the list size. Each receiver is 3565 queried a maximum number of times ("NORM_ROBUST_FACTOR", by default). 3566 Receivers not responding within this number of repeated requests are 3567 removed from the payload list to make room for other potential 3568 receivers pending acknowledgment. The transmission of the 3569 "NORM_CMD(ACK_REQ)" is repeated until no further responses are needed 3570 or until the repeat threshold is exceeded for all pending receivers. 3571 The transmission of "NORM_CMD(ACK_REQ)" or "NORM_CMD(FLUSH)" messages 3572 to conduct the positive acknowledgment process is multiplexed with 3573 ongoing sender data transmissions. However, the "NORM_CMD(FLUSH)" 3574 positive acknowledgment process MAY be interrupted in response to 3575 negative acknowledgment repair requests (NACKs) received from 3576 receivers during the acknowledgment period. The "NORM_CMD(FLUSH)" 3577 positive acknowledgment process is restarted for receivers pending 3578 acknowledgment once any the repairs have been transmitted. 3580 In the case of "NORM_CMD(FLUSH)" commands with an attached 3581 "acking_node_list", receivers will not ACK until they have received 3582 complete transmission of all data up to and including the given 3583 watermark transmission point. All receivers SHALL interpret the 3584 watermark point provided in the request NACK for repairs if needed as 3585 for "NORM_CMD(FLUSH)" commands with no attached "acking_node_list". 3587 5.5.4. Group Size Estimate 3589 NORM sender messages contain a "gsize" field that is a representation 3590 of the group size and is used in scaling random backoff timer ranges. 3591 The use of the group size estimate within the NORM protocol does not 3592 demand a precise estimation and works reasonably well if the estimate 3593 is within an order of magnitude of the actual group size. By 3594 default, the NORM sender group size estimate MAY be administratively 3595 configured. Also, given the expected scalability of the NORM 3596 protocol for general use, a default value of 10,000 is RECOMMENDED 3597 for use as the group size estimate. It is also possible the group 3598 size MAY be algorithmically approximated from the volume of 3599 congestion control feedback messages based on the exponentially 3600 weighted random backoff. However, the specification of such an 3601 algorithm is currently beyond the scope of this document. 3603 6. Configurable Elements 3605 The NORM protocol supports a modest number of configurable parameters 3606 that control operation. Most of these need only be set at NORM 3607 sender(s) and the configuration information is communicated to the 3608 receiver set in NORM header and/or header extension fields. A 3609 notable exception to this is the "NORM_ROBUST_FACTOR" that is 3610 presumed to be a common value preset among senders and receivers for 3611 a given NORM session. The following table summarizes these 3612 configurable elements: 3614 +----------------------+--------------------------------------------+ 3615 | Configurable Element | Purpose | 3616 +----------------------+--------------------------------------------+ 3617 | Sender Initial GRTT | Sender's Initial estimate of greatest | 3618 | Estimate | group round trip time. Affects timing of | 3619 | ("GRTT_sender") | feedback suppression and sender command | 3620 | | transmissions at sender startup. | 3621 | Backoff Factor | Sender's scaling factor used for | 3622 | ("K_sender") | timer-based feedback suppression. | 3623 | Group Size Estimate | Sender's rough estimate of receiver group | 3624 | ("GSIZE_sender") | size used in generation of random feedback | 3625 | | backoff timeout. | 3626 | "NORM_ROBUST_FACTOR" | Integer factor determining how | 3627 | | persistently (i.e. robust) senders | 3628 | | transmit repeated control messages and | 3629 | | receivers self-initiate timeout-based | 3630 | | NACKing in absence of sender activity. | 3631 | FEC Type ("fec_id") | Sender FEC encoding type. | 3632 | Sender segment size | Maximum size (in bytes) of the payload | 3633 | ("NormSegmentSize") | portion of "NORM_DATA" and other messages. | 3634 | NormNodeId | Unique identifiers pre-assigned to all | 3635 | | NORM session participants. | 3636 +----------------------+--------------------------------------------+ 3638 The sender-controlled GRTT estimate (referred to as "GRTT_sender" in 3639 this document) is used to set and scale various timers associated 3640 with NORM protocol operation. During steady-state operation, the 3641 sender probes the receiver set, adapts to the group round trip timing 3642 state, and advertises its estimate to the receiver set in "grtt" 3643 field of relevant NORM protocol messages. However, an initial value 3644 must be assumed at sender startup. A large initial estimate is 3645 conservative and safer with regards to preventing feedback implosion 3646 and starting up congestion control operation, but requires the sender 3647 and receivers to allocate more buffering resources for a given 3648 transmission rate (i.e. larger effective delay*bandwidth product) to 3649 maintain efficient operation. A default initial value of 3650 "GRTT_sender = 0.5" seconds is RECOMMENDED. 3652 The sender-controlled Backoff Factor (referred to a "K_sender" in 3653 this document) is used to scale protocol timers and contributes to 3654 the generation of the random backoff timeout value that facilitates 3655 timer-based feedback suppression. The sender advertises its 3656 configured Backoff Factor to the receiver set in the "backoff" field 3657 of applicable NORM messages and thus no receiver configuration is 3658 necessary. For ASM operation a default value of "K_sender = 4" is 3659 RECOMMENDED while for SSM operation a default value of "K_sender = 6" 3660 is RECOMMENDED. 3662 The sender estimate of session Group Size (referred to as 3663 "GSIZE_sender" in this document) also plays a role in the random 3664 selection of feedback suppression timeout values. The sender 3665 advertises its configured Group Size estimate to the receiver set in 3666 the "gsize" field of applicable NORM messages and thus no receiver 3667 configuration is necessary. Only a rough estimate (i.e. "order-of- 3668 magnitude") is needed for effective feedback suppression and a 3669 default value of "GSIZE_sender = 10,000" is RECOMMENDED as a 3670 conservative estimate for most uses. 3672 The "NORM_ROBUST_FACTOR" is an integer parameter that determines how 3673 persistently NORM senders transmit control message ("NORM_CMD" 3674 messages) such as end-of-transmission flushing, OPTIONAL positive 3675 acknowledgement requests, etc. Additionally, the receivers use their 3676 knowledge of "NORM_ROBUST_FACTOR" to determine when to consider a 3677 NORM sender inactive and MAY use the factor in determining how 3678 persistently to self-initiate repeated NACK repair requests upon such 3679 timeouts. This parameter is NOT communication in NORM protocol 3680 message headers and is presumed to be preset to a consistent value 3681 among sender and receivers for a given NORM session. A default value 3682 of "NORM_ROBUST_FACTOR = 20" is RECOMMENDED. 3684 Another NORM sender configuration element is the FEC Type used to 3685 encode "NORM_DATA" message content. The FEC type is communicated 3686 from the sender to the receiver set in the "fec_id" field of relevant 3687 NORM message headers. The "fec_id" value corresponds to an IANA- 3688 assigned value identifying the FEC encoding type as described in the 3689 FEC Building Block [RFC5052]. Typically, a sender SHOULD use a 3690 consistent FEC encoding for its participation in a session to simply 3691 receiver state allocation and maintenance, but it implementations MAY 3692 vary the FEC encoding type on a per-object basis if necessary. 3694 The sender NormSegmentSize setting determines the maximum size of the 3695 payload portion of "NORM_DATA" and other messages that the sender 3696 transmits. Additionally the payload size of feedback messages from 3697 receivers to a given sender is limited to that sender's 3698 NormSegmentSize. The NormSegmentSize SHOULD be configured to be 3699 compatible with expected network MTU limitations, given the added 3700 overhead of NORM, UDP, and IP protocol message headers. 3701 Additionally, MTU Discovery MAY be employed by the sender to 3702 determine an appropriate NormSegmentSize. The NormSegmentSize for a 3703 given sender can be determined by receivers from the FEC Object 3704 Transmission Information (FTI) provided either in applied EXT_FTI 3705 header extensions or pre-configured session information. 3707 Although it is not technically a configurable element, the receivers 3708 MUST have FEC Object Transmission Information for transmitted 3709 NormObjects to properly buffer, decode, and reassemble the original 3710 content. For loosely organized NORM protocol sessions, the sender 3711 MAY apply the "EXT_FTI" Header Extension to "NORM_DATA" and 3712 "NORM_INFO" (if applicable) messages so that receivers can get this 3713 information without prior coordination. An implementation MAY also 3714 apply the "EXT_FTI" only to "NORM_INFO" messages for reduced 3715 overhead. Or, finally, applications MAY also provide the FTI out-of- 3716 band prior to sender transmission. 3718 Each participant in a NORM protocol session MUST be configured with a 3719 unique NormNodeId value. The NormNodeId value is used by receivers 3720 to identify the sender to which their NACK or other feedback messages 3721 are addressed and senders use the NormNodeId to differentiate 3722 receivers for purposes of congestion control and OPTIONAL positive 3723 acknowledgement collection. Assignment of unique NormNodeId values 3724 can be done via a priori coordination and/or use of a deconfliction 3725 mechanism external to the NORM protocol itself. The values of 3726 "NORM_NODE_NONE = 0x00000000" and "NORM_NODE_ANY = 0xffffffff" are 3727 reserved and MUST NOT be assigned to NORM participants. 3729 7. Security Considerations 3731 The same security considerations that apply to the Multicast NACK 3732 [RFC5401], TFMCC [RFC4654], and FEC [RFC5052] Building Blocks also 3733 apply to the NORM protocol. In addition to the vulnerabilities to 3734 which any IP and IP multicast protocol implementation are subject, 3735 malicious hosts might engage in excessive NACKing in an attempt to 3736 prevent the NORM sender(s) from making forward progress in reliable 3737 transmission. Receiver "join" and "service" policy enforcement as 3738 described in Section 5.2 can be applied if such activity is detected. 3739 The use of cryptographic peer authentication, integrity checks, 3740 and/or confidentiality mechanisms can be used to provide a more 3741 effective degree of protection from objectionable transmissions from 3742 unauthorized hosts. But in some cases, even with authentication and 3743 integrity checks, the NACK-based feedback of NORM can be exploited by 3744 replay attacks forcing the NORM sender to unnecessarily transmit 3745 repair information. This MAY be addressed in part with network layer 3746 IP security implementations that guard against this potential 3747 security exploitation or alternatively with a security mechanism 3748 using the "EXT_AUTH" header extension for similar purposes. Such 3749 security mechanisms SHOULD be deployed and used when available. Use 3750 of security mechanisms will impose additional "a priori" 3751 configuration upon the NORM deployment depending upon the techniques 3752 used. 3754 The NORM protocol is compatible with the use of IP security (IPsec) 3755 [RFC4301] and the IPsec Encapsulating Security Payload (ESP) protocol 3756 or Authentication Header (AH) extension can be used to secure IP 3757 packets transmitted by NORM participants. A baseline approach to 3758 secure NORM operation using IPsec is described below. Compliant 3759 implementations of this specification are REQUIRED to be compatible 3760 with IPsec usage as described in Section 7.1. IPsec can be used to 3761 provide peer authentication, integrity protection, and/or encryption 3762 of packets containing NORM messages. 3764 Additionally, the "EXT_AUTH" header extension (HET = 1) is reserved 3765 for use by security mechanisms to provide alternatives to IPsec for 3766 security of NORM messages. The format of this header extension and 3767 its processing is outside the scope of this document and is to be 3768 communicated out-of-band as part of the session description. It is 3769 possible an "EXT_AUTH" implementation of MAY also provide for 3770 encryption of NORM message payloads as well as peer authentication 3771 and integrity protection. The use of this approach as compared to 3772 IPsec can allow for header compression techniques to be applied 3773 jointly to IP and NORM protocol headers. In cases where security 3774 analysis deems encryption of NORM protocol header content is 3775 beneficial or necessary, the aforementioned use of IPsec ESP might be 3776 more appropriate. Additionally, use of the "EXT_AUTH" header 3777 extension can be used when NORM is used in a network with Network 3778 Address Translation (NAT) systems that are incompatible with use of 3779 the IPsec AH extension. If "EXT_AUTH" is present, whatever packet 3780 authentication or integrity checks that can be performed immediately 3781 upon reception of the packet MUST be performed before accepting the 3782 packet and performing any congestion control-related action on it. 3783 Some packet authentication schemes impose a delay of several seconds 3784 between when a packet is received and when the packet can be fully 3785 authenticated. Any appropriate congestion control related action 3786 MUST NOT be postponed by any such packet security mechanism (i.e. 3787 Security mechanisms MUST NOT result in poor congestion control 3788 behavior). 3790 Consideration MUST also be given to the potential for replay-attacks 3791 that would transplant authenticated packets from one NORM session to 3792 another to disrupt service. To avoid this potential, unique keys 3793 SHOULD be assigned on a per-session basis or NORM sender nodes SHOULD 3794 be configured to use unique "instance_id" identifiers managed as part 3795 of the security association for the sessions. 3797 Note NORM implementations can use the "sequence" field from the NORM 3798 Common Message Header to detect replay attacks. This can be 3799 accomplished if the NORM sender maintains state on actively NACKing 3800 receivers. A cache of such receiver state can be used to provide 3801 protection against NACK replay attacks. NORM receivers MUST also 3802 maintain similar state for protection against possible replay of 3803 other receiver messages in ASM operation as well. For example, a 3804 receiver could be suppressed from providing NACK or congestion 3805 control feedback by replay of certain receiver messages. For these 3806 reasons, authentication of NORM messages (e.g., via IPsec) SHOULD be 3807 applied for protection against similar attacks that use fabricated 3808 messages. Also, encryption of messages to provide confidentiality of 3809 application data and protect privacy of users MAY also be applied 3810 using IPsec or similar mechanisms. 3812 When applicable security measures are used, automated key management 3813 mechanisms such as those described in the Group Domain of 3814 Interpretation (GDOI) [RFC3547], Multimedia Internet KEYing (MIKEY) 3815 [RFC3830] or Group Secure Association Key Management Protocol 3816 (GSAKMP) [RFC4535] specifications SHOULD be applied. 3818 While NORM does leverage FEC-based repair for scalability, this alone 3819 does not guarantee integrity of received data. Application-level 3820 integrity-checking of received data content is highly RECOMMENDED. 3821 This recommendation also applies when the IPsec security approach 3822 described below is used for added assurance in data content integrity 3823 given the shared use of IPsec Security Association information among 3824 the group. 3826 7.1. Baseline Secure NORM Operation 3828 This section describes a baseline mode of secure NORM protocol 3829 operation based on application of the IPsec security protocol. This 3830 approach is documented here to provide a reference, interoperable 3831 secure mode of operation. This particular approach represents one 3832 possible trade-off in the level of assurance that can be achieved and 3833 the scalability of multicast group-size given current IPsec 3834 mechanisms and the state required to support them. For example, this 3835 baseline approach specifies the use of a Security Association that is 3836 shared among the receiver set for feedback messages to the sender. 3837 This model requires that the receiver membership receiving the 3838 session keys is trusted and only provides protection from attacks 3839 that are external to the NORM group membership. More stateful and 3840 complex IPsec approaches and key management schemes may be applied 3841 for higher levels of assurance but those are beyond the scope of this 3842 transport protocol specification. Additional approaches to NORM 3843 security, including other forms of IPsec application, MAY be 3844 specified in the future. For example, the use of the EXT_AUTH header 3845 extension could enable NORM-specific authentication or security 3846 encapsulation headers similar to those of IPsec to be specified and 3847 inserted into the NORM protocol message headers. This would allow 3848 header compression techniques to be applied to IP and NORM protocol 3849 headers when needed in a similar fashion to RTP [RFC3550] and as 3850 preserved in the specification for Secure Real Time Protocol (SRTP) 3851 [RFC3711]. 3853 The baseline approach described is applicable to NORM operation 3854 configured for SSM (or SSM-like) operation where there is a single 3855 sender and the receivers are providing unicast feedback. This form 3856 of NORM operation allows for IPsec to be used with a manageable 3857 number of security associations (SA). 3859 7.1.1. IPsec Approach 3861 For NORM one-to-many SSM operation with unicast feedback from 3862 receivers, each node SHALL be configured with two transport mode 3863 IPsec security associations and corresponding Security Policy 3864 Database (SPD) entries. One entry will be used for sender-to-group 3865 multicast packet authentication and optionally encryption while the 3866 other entry will be used to provide security for the unicast feedback 3867 messaging from the receiver(s) to the sender. Note that this single 3868 SA for NORM receiver feedback messages is shared to protect traffic 3869 from possibly multiple receivers to the single sender. 3871 For each NormSession, the NORM sender SHALL use an IPsec SA 3872 configured for ESP protocol [RFC4303] operation with the option for 3873 data origin authentication enabled. It is also RECOMMENDED this 3874 IPsec ESP SA be also configured to provide confidentiality protection 3875 for IP packets containing NORM protocol messages. This is suggested 3876 to make the realization of complex replay attacks much more 3877 difficult. The encryption key for this SA SHALL be preplaced at the 3878 sender and receiver(s) prior to NORM protocol operation. Use of 3879 automated key management is RECOMMENDED as a rekey SHALL be REQUIRED 3880 prior to expiration of the sequence space for the SA. This is 3881 necessary so receivers can use the built-in IPsec replay attack 3882 protection possible for an IPsec SA with a single source (the NORM 3883 sender). Thus the receivers SHALL enable replay attack protection 3884 for this SA used to secure NORM sender traffic. An IPsec SPD entry 3885 MUST be configured to process outbound packets to the session 3886 (destination) address and UDP port number of the applicable 3887 (NormSession). 3889 The NORM receiver(s) MUST be configured with the SA and SPD entry to 3890 properly process the IPsec-secured packets from the sender. The NORM 3891 receiver(s) SHALL also use a common, second IPsec SA (common Security 3892 Parameter Index (SPI) and encryption key) configured for ESP 3893 operation with the option for data origination authentication 3894 enabled. Similar to the NORM sender, is RECOMMENDED this IPsec ESP 3895 SA be also configured to provide confidentiality protection for IP 3896 packets containing NORM protocol messages. The receivers MUST have 3897 an IPsec SPD entry configured to process outbound NORM/UDP packets 3898 directed to the NORM sender source address and port number using this 3899 second SA. To support NORM unicast feedback, the sender's 3900 transmission port number SHOULD be selected to be distinct from the 3901 multicast session port number to allow discrimination between unicast 3902 and multicast feedback messages when access to the IP destination 3903 address is not possible (e.g., a user-space NORM implementation). 3904 For processing of packets from receivers, the NORM sender SHALL be 3905 configured with this common, second SA (and the corresponding SPD 3906 entry needed) in order to properly process messages from the 3907 receiver. 3909 Multiple receivers using a common IPsec SA for traffic directed to 3910 the NORM sender (i.e., many-to-one) typically prevents the use of 3911 built-in IPsec replay attack protection by the NORM sender with 3912 current IPsec implementations. Thus the built-in IPsec replay attack 3913 protection for this second SA at the sender MUST be disabled unless 3914 the particular IPsec implementation manages its replay protection on 3915 a per-source basis (which is not typical of existing IPsec 3916 implementations). So, to support a fully secure mode of operation, 3917 the NORM sender implementation MUST provide replay attack protection 3918 based upon the "sequence" field of NORM protocol messages from 3919 receivers. This can be accomplished with high assurance of security, 3920 even with the limited size (16-bits) of this field, because 3922 1. NORM receiver NACK and non-CLR ACK feedback messages are sparse. 3924 2. The more frequent "NORM_ACK" feedback from CLR or PLR nodes are 3925 only a small set of receivers for which the sender needs to keep 3926 more persistent replay attack state. 3928 3. "NORM_NACK" feedback messages preceding the sender's current 3929 repair window do not significantly impact protocol operation 3930 (generation of "NORM_CMD(SQUELCH)" is limited) and could be in 3931 fact ignored. This means the sender can prune any replay attack 3932 state that precedes the current repair window. 3934 4. "NORM_ACK" messages correspond to either a specific sender 3935 "ack_id", the sender "cc_sequence" for ACKs sent in response to 3936 "NORM_CMD(CC)", or the sender's current repair window in the case 3937 of ACKs sent in response to "NORM_CMD(FLUSH)". Thus, the sender 3938 can prune any replay attack state for receivers that precede the 3939 current applicable sequence or repair window space. 3941 The use of ESP confidentiality for secure NORM protocol operation 3942 makes it more difficult for adversaries to conduct any form of replay 3943 attacks. Additionally, a NORM sender implementation with access to 3944 the full ESP protocol header could also use the ESP sequence 3945 information to make replay attack protection even more robust by 3946 maintaining the per-source ESP sequence state that existing IPsec 3947 implementations typically do not provide. The design of this 3948 baseline security approach for NORM intentionally places any more 3949 complex processing state or processing (e.g. replay attack protection 3950 given multiple receivers) at the NORM sender since NORM receiver 3951 implementations might often need to be less complex. 3953 This baseline approach can be used for NORM protocol sessions with 3954 multiple senders if the SA pairs described are established for each 3955 sender. For small-sized groups, it is even possible many-to-many 3956 (ASM) IPsec configuration could be achieved where each participant 3957 uses a unique SA (with a unique SPI). In this case, the sender(s) 3958 would maintain a SA for each other participant rather than a single, 3959 shared SA for receiver feedback messages. This does not scale to 3960 larger group sizes given the complex set of SA and SPD entries each 3961 participant would need to maintain. 3963 It is anticipated in early deployments of this baseline approach to 3964 NORM security that key management will be conducted out-of-band with 3965 respect to NORM protocol operation. In the case of one-to-many NORM 3966 operation, it is possible receivers will retrieve keying information 3967 from a central server as needed or otherwise conduct group key 3968 updates with a similar centralized approach. Alternatively, it is 3969 possible with some key management schemes for rekey messages to be 3970 transmitted to the group as a message or transport object within the 3971 NORM reliable transfer session. Similarly, for group-wise 3972 communication sessions it is possible for potential group 3973 participants to request keying and/or rekeying as part of NORM 3974 communications. Additional specification is necessary to define an 3975 in-band key management scheme for NORM sessions perhaps using the 3976 mechanisms of the automated group key management specifications cited 3977 in this document. Additional specification outside of the scope of 3978 this document would be needed to provide an interoperable approach 3979 for key management in-band of a NORM reliable transport session. 3981 7.1.2. IPsec Requirements 3983 In order to implement this secure mode of NORM protocol operation, 3984 the following IPsec capabilities are REQUIRED. 3986 7.1.2.1. Selectors 3988 The implementation MUST be able to use the source address, 3989 destination address, protocol (UDP), and UDP port numbers as 3990 selectors in the SPD. 3992 7.1.2.2. Mode 3994 IPsec in transport mode MUST be supported. The use of IPsec 3995 [RFC4301] processing for secure NORM traffic MUST be configured such 3996 that unauthenticated packets are not received by the NORM protocol 3997 implementation. 3999 7.1.2.3. Key Management 4001 An automated key management scheme for group key distribution and 4002 rekeying such as GDOI [RFC3547], GSAKMP [RFC4535], or MIKEY [RFC3830] 4003 is RECOMMENDED for use. Note it is possible for key update messages 4004 (e.g., the GDOI GROUPKEY-PUSH message) to be included as part of the 4005 NORM application reliable data transmission if appropriate interfaces 4006 are available between the NORM application and the key management 4007 daemon. Relatively short-lived NORM sessions MAY be able to use 4008 Manual Keying with a single, preplaced key, particularly if Extended 4009 Sequence Numbering (ESN) [RFC4303] is available in the IPsec 4010 implementation used. When manual keys are used, it is important that 4011 cryptographic algorithms suitable for manual key use are selected. 4013 7.1.2.4. Security Policy 4015 Receivers MUST accept protocol messages only from the designated, 4016 authorized sender(s). Appropriate key management will provide 4017 authentication, integrity and/or encryption keys only to receivers 4018 authorized to participate in a designated session. The approach 4019 outlined here allows receiver sets to be controlled on a per-sender 4020 basis. 4022 7.1.2.5. Authentication and Encryption 4024 Large NORM group sizes will necessitate some form of key management 4025 that does rely upon shared secrets. The GDOI and GSAKMP protocols 4026 mentioned here allow for certificate-based authentication. It is 4027 RECOMMENDED these certificates use IP addresses for authentication. 4029 7.1.2.6. Availability 4031 The IPsec requirements profile outlined here is commonly available on 4032 many potential NORM hosts. Configuration and operation of IPsec 4033 typically requires privileged user authorization. Automated key 4034 management implementations are typically configured with the 4035 privileges necessary to effect system IPsec configuration needed. 4037 8. IANA Considerations 4039 Values of NORM Header Extension Types, Stream Control Codes, and 4040 "NORM_CMD" message sub-types are subject to IANA registration. They 4041 are in the registry named "Reliable Multicast Transport (RMT) NORM 4042 Protocol Parameters" located at time of publication at: 4044 http://www.iana.org/assignments/norm-parameters 4046 Note the reliable multicast building block components used by this 4047 specification also have their respective IANA considerations and 4048 those documents SHOULD be consulted accordingly. In particular, the 4049 FEC Building Block used by NORM does REQUIRE IANA registration of the 4050 FEC codecs used. The registration instructions for FEC codecs are 4051 provided in RFC 5052. It is possible additional extensions of the 4052 NORM protocol might be specified in the future (e.g., additional NORM 4053 message types) and additional registries be established at that time 4054 with appropriate IETF standards action. 4056 8.1. Explicit IANA Assignment Guidelines 4058 This document introduces three registries for the NORM Header 4059 Extension Types, Stream Control Codes and "NORM_CMD" Message sub- 4060 types. This section describes explicit IANA assignment guidelines 4061 for each of these. 4063 8.1.1. NORM Header Extension Types 4065 This document defines a registry for NORM Header Extensions named 4066 "NORM Header Extension Types". 4068 The NORM Header Extension Type field is an 8-bit value. The values 4069 of this field identify extended header content allowing the protocol 4070 functionality to be expanded to include additional features and 4071 operating modes. The values that can be assigned within the "NORM 4072 Header Extensions" registry are numeric indexes in the range {0, 4073 255}, boundaries included. Values in the range {0,127} indicate 4074 variable length extended header fields while values in the range 4075 {128,255} indicate extensions of a fixed 4-byte length. This 4076 specification registers the following NORM Header Extension Types: 4078 +-------+------------+--------------------+ 4079 | Value | Name | Reference | 4080 +-------+------------+--------------------+ 4081 | 1 | "EXT_AUTH" | This specification | 4082 | 3 | "EXT_CC" | This specification | 4083 | 64 | "EXT_FTI" | This specification | 4084 | 128 | "EXT_RATE" | This specification | 4085 +-------+------------+--------------------+ 4087 Requests for assignment of additional NORM Header Extension Type 4088 values are granted on a "Specification Required" basis as defined by 4089 IANA Guidelines [RFC5226]. Any such header extension specifications 4090 MUST include a description of protocol actions to be taken when the 4091 extension type is encountered by a protocol implementation not 4092 supporting that specific option. For example, it is often possible 4093 for protocol implementations to ignore unknown header extensions. 4095 8.1.2. NORM Stream Control Codes 4097 This document defines a registry for NORM Stream Control Codes named 4098 "NORM Stream Control Codes". 4100 NORM Stream Control Codes are 16-bit values that can be inserted 4101 within a "NORM_OBJECT_STREAM" delivery object to convey sequenced, 4102 out-of-band (with respect to the stream data) control signaling 4103 applicable to the referenced stream object. These control codes are 4104 to be delivered to the application or protocol implementation with 4105 reliable delivery, in-order with respect to the their inserted 4106 position within the stream. This specification registers the 4107 following NORM Stream Control Code: 4109 +-------+-------------------+--------------------+ 4110 | Value | Name | Reference | 4111 +-------+-------------------+--------------------+ 4112 | 0 | "NORM_STREAM_END" | This specification | 4113 +-------+-------------------+--------------------+ 4115 Additional NORM Stream Control Code value assignment requests are 4116 granted on a "Specification Required" basis as defined by IANA 4117 Guidelines [RFC5226]. The full 16-bit space outside of the value 4118 assigned in this specification are available for future assignment. 4119 In addition to describing the control code's expected interpretation, 4120 such specifications MUST include a description of protocol actions to 4121 be taken when the control code is encountered by a protocol 4122 implementation not supporting that specific option. 4124 8.1.3. NORM_CMD Message Sub-types 4126 This document defines a registry for "NORM_CMD" message sub-types 4127 named "NORM Command Message Sub-types". 4129 The "NORM_CMD" message "sub-type" field is an 8-bit value with valid 4130 values in the range of 1-255. Note the value 0 is reserved to 4131 indicate an invalid "NORM_CMD" message sub-type. The current 4132 specification defines a number of "NORM_CMD" message sub-types 4133 senders can use to signal the receivers in various aspects of NORM 4134 protocol operation. This specification registers the following 4135 "NORM_CMD" Message Sub-types: 4137 +-------+-------------------------+--------------------+ 4138 | Value | Name | Reference | 4139 +-------+-------------------------+--------------------+ 4140 | 0 | reserved | This specification | 4141 | 1 | "NORM_CMD(FLUSH)" | This specification | 4142 | 2 | "NORM_CMD(EOT)" | This specification | 4143 | 3 | "NORM_CMD(SQUELCH)" | This specification | 4144 | 4 | "NORM_CMD(CC)" | This specification | 4145 | 5 | "NORM_CMD(REPAIR_ADV)" | This specification | 4146 | 6 | "NORM_CMD(ACK_REQ)" | This specification | 4147 | 7 | "NORM_CMD(APPLICATION)" | This specification | 4148 +-------+-------------------------+--------------------+ 4150 Future specifications extending NORM MAY define additional "NORM_CMD" 4151 messages to enhance protocol functionality. "NORM_CMD" message sub- 4152 type value assignment requests are granted on a "Specification 4153 Required" basis as defined by IANA Guidelines [RFC5226]. In addition 4154 to describing the command sub-type's expected interpretation, 4155 specifications MUST include a description of protocol actions to be 4156 taken when the command is encountered by a protocol implementation 4157 not supporting that specific option. 4159 This specification already defines an "application-defined" 4160 "NORM_CMD" message sub-type for use at the discretion of individual 4161 applications using NORM for transport. These "application-defined" 4162 commands are suitable for many application-specific purposes and do 4163 not involve standards action. In any case, such additional messages 4164 SHALL be subject to the same congestion control constraints as the 4165 existing NORM sender message set. 4167 9. Suggested Use 4169 The present NORM protocol is seen as useful tool for the reliable 4170 data transfer over generic IP multicast services. It is not the 4171 intention of the authors to suggest it is suitable for supporting all 4172 envisioned multicast reliability requirements. NORM provides a 4173 simple and flexible framework for multicast applications with a 4174 degree of concern for network traffic implosion and protocol overhead 4175 efficiency. NORM-like protocols have been successfully demonstrated 4176 within the MBone for bulk data dissemination applications, including 4177 weather satellite compressed imagery updates servicing a large group 4178 of receivers and a generic web content reliable "push" application. 4180 In addition, this framework approach has some design features making 4181 it attractive for bulk transfer in asymmetric and wireless 4182 internetwork applications. NORM is capable of successfully operating 4183 independent of network structure and in environments with high packet 4184 loss, delay, and out-of-order delivery. Hybrid proactive/reactive 4185 FEC-based repairing improve protocol performance in some multicast 4186 scenarios. A sender-only repair approach often makes additional 4187 engineering sense in asymmetric networks. NORM's unicast feedback 4188 capability is suitable for use in asymmetric networks or in networks 4189 where only unidirectional multicast routing/delivery service exists. 4190 Asymmetric architectures supporting multicast delivery are likely to 4191 make up an important portion of the future Internet structure (e.g., 4192 direct broadcast satellite (DBS) or cable and public-switched 4193 telephone network (PSTN) hybrids, etc) and efficient, reliable bulk 4194 data transfer will be an important capability for servicing large 4195 groups of subscribed receivers. 4197 10. Changes from RFC3940 4199 This section lists the changes between the Experimental version of 4200 this specification, RFC 3940, and this version: 4202 1. Removal of the "NORM_FLAG_MSG_START" for "NORM_OBJECT_STREAM", 4203 replacing it with the "payload_msg_start" field in the FEC- 4204 encoded preamble of the "NORM_OBJECT_STREAM NORM_DATA" payload, 4206 2. Definition of IANA registry for header extension and other 4207 assignments, 4209 3. Removal of file blocking scheme description now specified in the 4210 FEC Building Block document [RFC5052], 4212 4. Removal of restriction of NORM receiver feedback message rate to 4213 local NORM sender rate (This caused congestion control failures 4214 in high speed operation. The extremely low feedback rate of the 4215 NORM protocol as compared to TCP avoids any resultant impact to 4216 the network as shown in [Mdpcc]), 4218 5. Correction of errors in some message format descriptions, and 4220 6. Correction of inconsistency in specification of the inactivity 4221 timeout. 4223 7. Addition of IPsec secure mode description with IPsec 4224 requirements. 4226 8. Addition of the EXT_AUTH header extension definition. 4228 9. Clarification of interpretation of "Source Block Length" when FEC 4229 codes are arbitrarily shortened by the sender. 4231 11. Acknowledgments 4233 (and these are not Negative) 4235 The authors would like to thank Rick Jones, Vincent Roca, Rod Walsh, 4236 Toni Paila, Michael Luby, and Joerg Widmer for their valuable input 4237 and comments on this document. The authors would also like to thank 4238 the RMT working group chairs, Roger Kermode and Lorenzo Vicisano, for 4239 their support in development of this specification, and Sally Floyd 4240 for her early input into this document. 4242 12. References 4243 12.1. Normative References 4245 [RFC1112] Deering, S., "Host extensions for IP multicasting", STD 5, 4246 RFC 1112, August 1989. 4248 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 4249 Requirement Levels", BCP 14, RFC 2119, March 1997. 4251 [RFC4301] Kent, S. and K. Seo, "Security Architecture for the 4252 Internet Protocol", RFC 4301, December 2005. 4254 [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", 4255 RFC 4303, December 2005. 4257 [RFC4607] Holbrook, H. and B. Cain, "Source-Specific Multicast for 4258 IP", RFC 4607, August 2006. 4260 [RFC4654] Widmer, J. and M. Handley, "TCP-Friendly Multicast 4261 Congestion Control (TFMCC): Protocol Specification", 4262 RFC 4654, August 2006. 4264 [RFC5052] Watson, M., Luby, M., and L. Vicisano, "Forward Error 4265 Correction (FEC) Building Block", RFC 5052, August 2007. 4267 [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an 4268 IANA Considerations Section in RFCs", BCP 26, RFC 5226, 4269 May 2008. 4271 [RFC5401] Adamson, B., Bormann, C., Handley, M., and J. Macker, 4272 "Multicast Negative-Acknowledgment (NACK) Building 4273 Blocks", RFC 5401, November 2008. 4275 12.2. Informative References 4277 [FecHybrid] 4278 Gossink, D. and J. Macker, "Reliable Multicast and 4279 Integrated Parity Retransmission with Channel Estimation", 4280 IEEE Globecomm , 1998. 4282 [McastFeedback] 4283 Nonnenmacher, J. and E. Biersack, "Optimal Multicast 4284 Feedback", IEEE INFOCOM, p. 964, March/April 1998. 4286 [MdpToolkit] 4287 Macker, J. and B. Adamson, "The Multicast Dissemination 4288 Protocol (MDP) Toolkit", Proc. IEEE MILCOM , October 1999. 4290 [Mdpcc] Adamson, B. and J. Macker, "A TCP-Friendly, Rate-based 4291 Mechanism for NACK-Oriented Reliable Multicast Congestion 4292 Control", Proc. IEEE GLOBECOMM , November 2001. 4294 [NormFeedback] 4295 Adamson, B. and J. Macker, "Quantitative Prediction of 4296 NACK-Oriented Reliable Multicast (NORM) Feedback", IEEE 4297 MILCOM , October 2002. 4299 [PgmccPaper] 4300 Rizzo, L., "pgmcc: A TCP-Friendly Single-Rate Multicast 4301 Congestion Control Scheme", ACM SIGCOMM , August 2000. 4303 [RFC2357] Mankin, A., Romanov, A., Bradner, S., and V. Paxson, "IETF 4304 Criteria for Evaluating Reliable Multicast Transport and 4305 Application Protocols", RFC 2357, June 1998. 4307 [RFC2974] Handley, M., Perkins, C., and E. Whelan, "Session 4308 Announcement Protocol", RFC 2974, October 2000. 4310 [RFC3048] Whetten, B., Vicisano, L., Kermode, R., Handley, M., 4311 Floyd, S., and M. Luby, "Reliable Multicast Transport 4312 Building Blocks for One-to-Many Bulk-Data Transfer", 4313 RFC 3048, January 2001. 4315 [RFC3269] Kermode, R. and L. Vicisano, "Author Guidelines for 4316 Reliable Multicast Transport (RMT) Building Blocks and 4317 Protocol Instantiation documents", RFC 3269, April 2002. 4319 [RFC3453] Luby, M., Vicisano, L., Gemmell, J., Rizzo, L., Handley, 4320 M., and J. Crowcroft, "The Use of Forward Error Correction 4321 (FEC) in Reliable Multicast", RFC 3453, December 2002. 4323 [RFC3547] Baugher, M., Weis, B., Hardjono, T., and H. Harney, "The 4324 Group Domain of Interpretation", RFC 3547, July 2003. 4326 [RFC3550] Schulzrinne, H., Casner, S., Frederick, R., and V. 4327 Jacobson, "RTP: A Transport Protocol for Real-Time 4328 Applications", STD 64, RFC 3550, July 2003. 4330 [RFC3711] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K. 4331 Norrman, "The Secure Real-time Transport Protocol (SRTP)", 4332 RFC 3711, March 2004. 4334 [RFC3830] Arkko, J., Carrara, E., Lindholm, F., Naslund, M., and K. 4335 Norrman, "MIKEY: Multimedia Internet KEYing", RFC 3830, 4336 August 2004. 4338 [RFC3940] Adamson, B., Bormann, C., Handley, M., and J. Macker, 4339 "Negative-acknowledgment (NACK)-Oriented Reliable 4340 Multicast (NORM) Protocol", RFC 3940, November 2004. 4342 [RFC4535] Harney, H., Meth, U., Colegrove, A., and G. Gross, 4343 "GSAKMP: Group Secure Association Key Management 4344 Protocol", RFC 4535, June 2006. 4346 [RFC4566] Handley, M., Jacobson, V., and C. Perkins, "SDP: Session 4347 Description Protocol", RFC 4566, July 2006. 4349 [RFC5445] Watson, M., "Basic Forward Error Correction (FEC) 4350 Schemes", RFC 5445, March 2009. 4352 [RmComparison] 4353 Pingali, S., Towsley, D., and J. Kurose, "A Comparison of 4354 Sender-Initiated and Receiver-Initiated Reliable Multicast 4355 Protocols", Proc. INFOCOMM, San Francisco CA, 4356 October 1993. 4358 [TcpModel] 4359 Padhye, J., Firoiu, V., Towsley, D., and J. Kurose, 4360 "Modeling TCP Throughput: A Simple Model and its Empirical 4361 Validation", ACM SIGCOMM , 1998. 4363 [TfmccPaper] 4364 Widmer, J. and M. Handley, "Extending Equation-Based 4365 Congestion Control to Multicast Applications", ACM 4366 SIGCOMM , August 2001. 4368 Authors' Addresses 4370 Brian Adamson 4371 Naval Research Laboratory 4372 Washington, DC 20375 4373 USA 4375 Email: adamson@itd.nrl.navy.mil 4377 Carsten Bormann 4378 Universitaet Bremen TZI 4379 Postfach 330440 4380 D-28334 Bremen 4381 Germany 4383 Email: cabo@tzi.org 4384 Mark Handley 4385 University College London 4386 Gower Street 4387 London WC1E 6BT 4388 UK 4390 Email: M.Handley@cs.ucl.ac.uk 4392 Joe Macker 4393 Naval Research Laboratory 4394 Washington, DC 20375 4395 USA 4397 Email: macker@itd.nrl.navy.mil