| Internet-Draft | CCNx chunking | January 2026 |
| Mosko & Asaeda | Expires 29 July 2026 | [Page] |
This document specifies a chunking protocol for dividing a user payload into CCNx Content Objects. It defines a name segment type to identify each sequential chunk number and a Content Object field to identify the last available chunk number. This includes specification for the naming convention to use for the chunked payload and a field added to a Content Object to represent the last chunk of an object. This document updates RFC8569 and RFC8609.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 29 July 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
CCNx Content Objects [RFC8569] are sized to amortize cryptographic operations over user data while simultaneously staying a reasonable size for transport over today's networks. This means a Content Object is usually within common UDP or jumbo Ethernet size. If a publisher has a larger amount of data to associate with a single Name, the data may be chunked with this chunking protocol. This protocol uses state in the Name and in an optional field within the Content Object. A chunked object may also have an external metadata that describes the original pre-chunked object.¶
For example, a video file may be several gigabytes of data. To publish the video, one would divide it up into transport-sized Content Objects. Each Content Object would have a common name prefix plus a chunk number.¶
CCNx uses two types of messages: Interests and Content Objects [RFC8569]. An Interest carries the hierarchically structured Name of a Content Object which serves as a request to return that object. A Content Object contains the Name, the object's Payload, and the cryptographic information used to bind the Name to the payload.¶
This document introduces three new protocol elements to CCNx by updating [RFC8609].¶
Experiments employing ICN protocols like CCNx all require a consistent way to represent objects larger than can be carried as a single protocol message. This specification provides such capabilities for simple cases where the flexibility of a Manifest approach like that in FLIC [I-D.irtf-icnrg-flic] are not strictly needed. Experiments will shed light on how to best optimize the fetching of large objects using CCNx Interest/Data exchanges.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Chunking, as used in this specification, means serializing user data into one or more chunks, each encapsulated in a CCNx Content Object. A chunk is a contiguous byte range within the user data. One segment in the Name of each Content Object represents the chunk number. A field in the Content Object that a chunk is the last chunk of the object Chunks are denoted by a serial counter, beginning at 0 and incrementing by 1 for each contiguous chunk. Any Interest issued with a chunk number higher than the last chunk number MUST be dropped with no response.¶
This document introduces the new CCNx Name Segment TLV, ChunkNumber, for conveying chunk numbers. The ChunkNumber is the serial order of the chunks. It MUST begin at 0 and MUST be incremented by 1. The value of the ChunkNumber TLV is a network byte order compact encoding of the chunk number.¶
This document also introduces the new CCNx Message Type TLV, EndChunkNumber. The EndChunkNumber indicates the last chunk number of the chunked user data. It MUST be included in the Content Object which is the last chunk of user data, where the ChunkNumber TLV value and the EndChunkNumber TLV value MUST be the same. The value of the EndChunkNumber value is the same format as the ChunkNumber name segment. For example, if 3000 bytes of user data is split with a 1200 byte block size, there will be 3 chunks: 0, 1, and 2. The EndChunkNumber is 2.¶
The EndChunkNumber field MAY be present in any of the object’s chunks, such as to assist in pipelining Interests. It MAY be placed repeatedly across multiple chunks to maximize the fetching flexibility of a consumer.¶
The value of the EndChunkNumber MAY be increased by subsequent EndChunkNumber fields. However, it SHOULD NOT be decreased. If a publisher wishes to close terminate creation of chunks before reaching the last chunk, it should publish empty Content Objects to fill out to the maximum EndChunkNumber ever published. These padding chunks MUST contain the real last chunk number in the EndChunkNumber with an empty Payload TLV. This mechanism for early termination is to accommodate circumstances where a data creation by the producer ended before expected.¶
It may occur that a publisher never includes an EndChunkNumber, and thus has never published the last chunk. This may happen due to an error or network conditions that do not allow finding the last chunk. If a consumer times out trying to retrieve chunks, it SHOULD report an error to the user and terminate. This is similar to a TCP client not hearing a FIN.¶
If the user data fits within one Content Object and the publisher uses the Chunking protocol, the publisher names the content with "Chunk=0" and includes "EndChunkNumber=0" (assuming the Payload is in the first chunk).¶
In addition, this document introduces the new CCNx Message Type TLV, ChunkSize, for specifying a constant payload size. Chunking MAY use a fixed block size, where only the last chunk MAY use a smaller block size. This is required to allow a reader to seek to a specific byte offset once it knows the block size. If the first (Chunk 0) object has the field ChunkSize, then the series of chunked objects uses a fixed payload size. ChunkSize MUST only appear in Chunk 0, if it is used. The first chunk of user data (a chunk with a Payload TLV) may not be chunk 0.¶
Any mismatch between the value of the length field of the payload TLV and the the ChunkSize TLV is considered an error of chunk creation by the producer. Such mismatched Data messages returned from a matching Interest MUST be discarded by the consumer.¶
Because of the possible use of a fixed block size, the inclusion of certain cryptographic fields in the same Content Objects as user data would throw off the ability to seek. Therefore, it is RECOMMENDED that all required cryptographic data, such as public keys or key name links, be included in the leading chunks before the first byte of user data. User data SHOULD then run continuously. If the publisher included ChunkSize in Chunk 0, then all Payload sizes must be of ChunkSize except the last, which may be smaller.¶
Data produced using the chunking protocol may also be represented via a Manifest (e.g., FLIC [I-D.irtf-icnrg-flic]). An advantage of using a Manifest is that all cryptographic data is in the manifest, which then links to each chunk via a full hash name. This means that the chunked user data can devote all available Content Object bytes after the name to the user data.¶
To summarize:¶
Chunk 0 MAY include the public key or key name link used to verify the chunked data. It is RECOMMENDED to use the same key for the whole set of chunked data. If a publisher uses multiple keys, then the public key or key name link for all keys SHOULD be in the leading chunks before any user data. Each subsequent chunk only needs to include the KeyId and signature.¶
As noted above, using a Manifest eliminates the need for cryptographic material in the user-data Content Objects.¶
Here are some examples of chunked Names using the Labeled Content Identifier URI scheme in human readable form (ccnx:).¶
In this example, the content producer publishes a JPG that takes 4 Chunks. The EndChunkNumber is missing in the first content object (Chunk 0), but is known and included when Chunk 1 is published. It is omitted in Chunk 2, then appears in Chunk 3, where it is mandatory.¶
ccnx:/Name=example.com/Name=picture.jpg/Chunk=0 -- ccnx:/Name=example.com/Name=picture.jpg/Chunk=1 EndChunkNumber=3 ccnx:/Name=example.com/Name=picture.jpg/Chunk=2 -- ccnx:/Name=example.com/Name=picture.jpg/Chunk=3 EndChunkNumber=3¶
In this example, the publisher is publishing an audio stream that ends before expected so the publisher fills empty Content Objects out to the maximum ChunkNumber, stating the correct EndChunkNumber. Chunks 4, 5, and 6 do not contain any new user data.¶
ccnx:/Name=example.com/Name=talk.wav/Chunk=0 -- ccnx:/Name=example.com/Name=talk.wav/Chunk=1 EndChunkNumber=6 ccnx:/Name=example.com/Name=talk.wav/Chunk=2 -- ccnx:/Name=example.com/Name=talk.wav/Chunk=3 EndChunkNumber=3 ccnx:/Name=example.com/Name=talk.wav/Chunk=4 EndChunkNumber=3 ccnx:/Name=example.com/Name=talk.wav/Chunk=5 EndChunkNumber=3 ccnx:/Name=example.com/Name=talk.wav/Chunk=6 EndChunkNumber=3¶
This section specifies the TLV types used by CCNx chunking. TBA by IANA (see Section 6).¶
CCNx chunking defines one new CCNx Name Segment type in the IANA Registry: ChunkNumber.¶
| Type | Abbrev | Name | Description |
|---|---|---|---|
| TBA by IANA | T_CHUNK | Chunk Number (Section 4.1) | The Chunk number of the associated Content Object. It is an unsigned integer in network byte order without leading zeros. The value of zero is represented as the single byte %x00. |
In ccnx: URI form, it is denoted as "Chunk", like the example shown in Section 3.3.¶
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+---------------+--------------+
| T_CHUNK | Length |
+---------------+---------------+---------------+--------------+
| variable length integer /
+---------------+---------------+
CCNx chunking defines two new CCNx Message types in the IANA Registry: EndChunkNumber and ChunkSize.¶
| Type | Abbrev | Name | Description |
|---|---|---|---|
| TBA by IANA | T_ENDCHUNK | EndChunkNumber (Section 4.2) | The value in the EndChunkNumber TLV indicates the last chunk number. It is an unsigned integer in network byte order without leading zeros. The value of zero is represented as the single byte %x00. |
| TBA by IANA | T_CHUNK_SIZE | ChunkSize (Section 4.2) | The fixed payload size of user data up to the last chunk. It MUST be a positive integer. |
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+---------------+--------------+
| T_ENDCHUNK | Length |
+---------------+---------------+---------------+--------------+
| variable length integer /
+---------------+---------------+
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+---------------+--------------+
| T_CHUNK_SIZE | Length |
+---------------+---------------+---------------+--------------+
| variable length integer /
+---------------+---------------+
The authors would like to thank Ken Calvert and David Oran for their valuable comments and suggestions on this document.¶
As per [RFC8126], this section makes an assignment in one existing registry in the "Content-Centric Networking (CCNx)" registry group. The registration procedure is "RFC Required".¶
This document defines one message type, T_CHUNK, whose suggested value is %x0005.¶
This document defines two message types, T_ENDCHUNK and T_CHUNK_SIZE, whose suggested values are %x0008 and %0x0009, respectively.¶
This draft does not put any requirements on how chunked data is signed or validated.¶