Interest Packet¶
NDN Interest packet is TLV defined as follows:
Interest ::= INTEREST-TYPE TLV-LENGTH
Name
Selectors?
Nonce
InterestLifetime?
ForwardingHint?
Name
and Nonce
are the only two required elements in an Interest packet.
Selectors are optional elements that further qualify Data that may match the Interest.
They are used for discovering and selecting the Data that matches best to what the application wants. Selectors are placed right after the Name to facilitate implementations that may use continuous memory block of Name and Selectors TLVs together as the index for PIT lookup. By using a TLV to group all the Selectors, an implementation can easily skip them to find Nonce, which is used together with Name to identify looping Interests.
If Selectors TLV is present in the Interest, it MUST contain at least one selector.
InterestLifetime
and ForwardingHint
are optional and are referred to as Guiders.
They affect Interest forwarding behavior.
Name¶
The Name element in an Interest is synonymous with the term prefix. See Name section for details.
The Name element that can be put in the Interest is further restricted to have at least one NameComponent. Interests that include Name TLV that has zero name components MUST BE discarded.
Selectors¶
Selectors ::= SELECTORS-TYPE TLV-LENGTH
MinSuffixComponents?
MaxSuffixComponents?
PublisherPublicKeyLocator?
Exclude?
ChildSelector?
MustBeFresh?
MinSuffixComponents, MaxSuffixComponents¶
MinSuffixComponents ::= MIN-SUFFIX-COMPONENTS-TYPE TLV-LENGTH
nonNegativeInteger
MaxSuffixComponents ::= MAX-SUFFIX-COMPONENTS-TYPE TLV-LENGTH
nonNegativeInteger
When needed, MinSuffixComponents
and MaxSuffixComponents
allow a data consumer to indicate whether the Name in the Interest is the full name including the digest, or the full name except for the digest, or the content it is seeking has a known range of legitimate component counts.
These two parameters refer to the number of name components beyond those in the prefix, and counting the implicit digest, that may occur in the matching Data.
The default for MinSuffixComponents
is 0 and for MaxSuffixComponents
is effectively infinite, meaning that any Data whose name starts with the prefix is a match. Often only one of these will be needed to get the desired effect.
PublisherPublicKeyLocator¶
PublisherPublicKeyLocator ::= KeyLocator
This element specifies the name of the key which is used to sign the Data packet that the consumer is requesting. This is a way for the Interest to select answers from a particular publisher.
See KeyLocator section for more detail.
Exclude¶
Exclude ::= EXCLUDE-TYPE TLV-LENGTH AnyLeading? (NameComponent | AnyBetween)* AnyTrailing?
AnyLeading ::= Any NameComponent
AnyBetween ::= NameComponent Any NameComponent
AnyTrailing ::= NameComponent Any
Any ::= ANY-TYPE TLV-LENGTH(=0)
The Exclude
selectors allow requesters to specify list and/or ranges of name components that MUST NOT appear as a continuation of the Name prefix in the responding Data packet to the Interest.
For example, if Interest is expressed for /ndn/edu
and Exclude specifies one name component ucla
, then neither data producer nor conforming NDN routers are allowed to return any Data packet that has prefix /ndn/edu/ucla
.
Exclude filter applies only to a name component of the Data packet name that is located at a position that numerically equals to the number of name components in the Interest packet, assuming 0 is the first name component.
The Components in the exclusion list MUST occur in strictly increasing order according to the canonical NDN name component ordering (Name Section), with optional leading, trailing, and interleaved Any
components. The following defines processing of Any
components:
- If none of the
Any
components are specified, the filter excludes only the names specified in the Exclude list. - If a leading
Any
component is specified, then the filter excludes all names that are smaller or equal (in NDN name component canonical ordering) to the first NameComponent in the Exclude list. - If a trailing
Any
component is specified, then the filter excludes all names that are larger or equal (in NDN name component canonical ordering) to the last NameComponent in the Exclude list. - If
Any
component is specified between two NameComponents in the list, then the filter excludes all names from the range from the right NameComponent to the left NameComponent, including both ends.
Exclude filter MUST not consist of a single Any
component or one NameComponent with leading and trailing Any
components.
ChildSelector¶
ChildSelector ::= CHILD-SELECTOR-TYPE TLV-LENGTH
nonNegativeInteger
Often a given Interest can match more than one Data within a given content store.
The ChildSelector
provides a way of expressing a preference for which of these should be returned.
If the value is 0, the leftmost child is preferred.
If 1, the rightmost child is preferred.
Here leftmost and rightmost refer to the least and greatest components according to the canonical NDN name component ordering (Name Section).
This ordering is only done at the level of the name hierarchy one past the name prefix.
If the ChildSelector
field is not present, the leftmost child is preferred (a value of 0).
For example, assuming in the name hierarchy the component immediately after the name prefix is the version number, whose next level is the segment number, then setting ChildSelector to be 1 will retrieve the rightmost version number (i.e., the latest version) and the leftmost segment number (i.e., the first segment). However, this selection is only done with respect to a single content store, not globally. Additional rounds that exclude the earlier versions may be used to explore other content stores for newer versions. In this case, the use of ChildSelector does not change the multi-round outcome, but it decreases the number of rounds needed to converge to an answer.
MustBeFresh¶
MustBeFresh ::= MUST-BE-FRESH-TYPE TLV-LENGTH(=0)
This selector is encoded with Type and Length but no Value part. When it is absent from an Interest packet, the router can respond with a Data packet from its content store whose FreshnessPeriod is either still valid or expired. When it is present in an Interest packet, the router should not return Data packet from its content store whose FreshnessPeriod has expired.
The FreshnessPeriod carried in each Data packet (Data Section) is set by the original producer. It starts counting down when the Data packet arrives at a node. Consequently if a node is N hops away from the original producer, it may not consider the Data stale until N X FreshnessPeriod after the Data is produced.
Nonce¶
Nonce defined as follows:
Nonce ::= NONCE-TYPE TLV-LENGTH(=4) BYTE{4}
The Nonce carries a randomly-generated 4-octet long byte-string. The combination of Name and Nonce should uniquely identify an Interest packet. This is used to detect looping Interests.
Guiders¶
InterestLifetime¶
InterestLifetime ::= INTEREST-LIFETIME-TYPE TLV-LENGTH nonNegativeInteger
InterestLifetime
indicates the (approximate) time remaining before the Interest times out.
The value is the number of milliseconds. The timeout is relative to the arrival time of the Interest at the current node.
Nodes that forward Interests may decrease the lifetime to account for the time spent in the node before forwarding, but are not required to do so. It is recommended that these adjustments be done only for relatively large delays (measured in seconds).
It is the application that sets the value for InterestLifetime
.
If the InterestLifetime
element is omitted, a default value of 4 seconds is used (4000).
The missing element may be added before forwarding.
ForwardingHint¶
ForwardingHint ::= FORWARDING-HINT-TYPE TLV-LENGTH
Delegation+
The ForwardingHint field contains a list of name delegations, as defined in Link Object section.
Each delegation implies that the requested Data packet can be retrieved by forwarding the Interest along the delegation path.
Specifics of the forwarding logic for Interests with ForwardingHint
will be defined in a separated document.