NDN Data packet is TLV defined as follows:
Data ::= DATA-TLV TLV-LENGTH Name MetaInfo Content Signature
The Data packet represents some arbitrary binary data (held in the Content element) together with its Name, some additional bits of information (MetaInfo), and a digital Signature of the other three elements. The Name is the first element since all NDN packet processing starts with the name. Signature is put at the end of the packet to ease the implementation because signature computation covers all the elements before Signature.
|||If ContentType, FreshnessPeriod and FinalBlockId are optional, one may consider Metainfo itself should be optional. But would having all 4 parts of Data packet help simplify implementation? We leave this question to people who are more familiar with high speed implementations.|
MetaInfo ::= META-INFO-TYPE TLV-LENGTH ContentType? FreshnessPeriod? FinalBlockId?
ContentType ::= CONTENT-TYPE-TYPE TLV-LENGTH nonNegativeInteger
The following ContentTypes are currently defined:
|ContentType||Assigned value||Description of the content|
|BLOB||0||payload identified by the data name; this is the default ContentType|
|LINK||1||a list of delegations (see Link Object)|
Other ContentType numbers are assigned and maintained in NDN Packet Specification Wiki.
FreshnessPeriod ::= FRESHNESS-PERIOD-TLV TLV-LENGTH nonNegativeInteger
The optional FreshnessPeriod indicates how long a node should wait after the arrival of this data before marking it as stale. The encoded value is number of milliseconds. Note that the stale data is still valid data; the expiration of FreshnessPeriod only means that the producer may have produced newer data.
Each content store associates every piece of Data with a staleness bit. If the Data carries a FreshnessPeriod, it will initially be considered “fresh” and, after the Data has resided in the content store for FreshnessPeriod, it will be marked as stale. This is per object staleness and is local to the NDN node.
If an Interest contains MustBeFresh TLV, a content store MUST NOT return Data with the staleness bit set in response to this interest. The effect is the same as if that stale Data did not exist (i.e., the Interest might be matched by some other Data in the store, or, failing that, get forwarded to other nodes). When an exact duplicate of the “stale” Data packet, carrying a positive FreshnessPeriod value, is inserted into a content store, the store SHOULD remove the “stale” bit from the cached Data. In particular, the Data in the store is no longer stale.
When a content store receives a Data packet without a FreshnessPeriod or with a FreshnessPeriod equal to 0, then it can satisfy an Interest marked MustBeFresh.
FinalBlockId ::= FINAL-BLOCK-ID-TLV TLV-LENGTH NameComponent
The optional FinalBlockId indicates the identifier of the final block in a sequence of fragments. It should be present in the final block itself, and may also be present in other fragments to provide advanced warning of the end to consumers. The value here should be equal to the last explicit Name Component of the final block.
Content ::= CONTENT-TYPE TLV-LENGTH BYTE*