Project

General

Profile

NDNLPv2 » History » Version 63

Davide Pesavento, 02/25/2023 06:54 AM

1 1 Junxiao Shi
# NDNLPv2
2 2 Alex Afanasyev
3 45 Davide Pesavento
{{>toc}}
4
5 16 Junxiao Shi
NDNLPv2 is a link protocol for [Named Data Networking](https://named-data.net/).
6 1 Junxiao Shi
7 62 Davide Pesavento
It provides the following features:
8 2 Alex Afanasyev
9
* fragmentation and reassembly: fragment a network layer packet to fit in link MTU
10
* failure detection: rapidly detect link failure and recovery
11
* reliability: reduce packet loss
12
* integrity: prevent packet injection
13
* forwarding instruction: NACK, nexthop choice, cache control, etc
14
* packet information: for management and monitoring
15
16
NDNLPv2 is designed to be a **unified protocol** that can be used on all kinds of links, including but not limited to: UNIX sockets, Ethernet unicast/multicast, UDP unicast/multicast, TCP connections, WebSockets, etc.
17 1 Junxiao Shi
18 62 Davide Pesavento
The NDNLPv2 protocol operates as a **link adaptation layer**; it is above link layer and below network layer. Please refrain from calling it "layer 2.5": there is no such notion in RFC protocols.
19 1 Junxiao Shi
20 62 Davide Pesavento
Different links may need different features, or different designs of a feature. NDNLPv2 ensures that **all features are optional** and can be turned on or off on a per-link basis. NDNLPv2 also allows different designs of a feature to be adopted per-link.
21 2 Alex Afanasyev
22
NDNLPv2 deprecates and replaces: [original NDNLP (aka NDNLPv1)](https://named-data.net/publications/techreports/trlinkprotocol/), [NDNLPv1 multicast extension](https://github.com/NDN-Routing/NDNFD/blob/master/docs/NDNLP.md), [NDNLPv1-TLV](https://redmine.named-data.net/projects/nfd/wiki/NDNLP-TLV/7), [NDNLP-BFD](https://redmine.named-data.net/attachments/download/231/NDNLP-BFDSummaryReport.pdf), [NFD LocalControlHeader](https://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader/25).
23
24 50 Davide Pesavento
## General NDNLPv2 Packet Format
25 2 Alex Afanasyev
26 63 Davide Pesavento
NDNLPv2 packet adopts a Type-Length-Value (TLV) structure similar to [NDN Packet Format](https://docs.named-data.net/NDN-packet-spec/0.3/tlv.html).
27 1 Junxiao Shi
28 47 Junxiao Shi
    LpPacket = LP-PACKET-TYPE TLV-LENGTH
29 63 Davide Pesavento
               *LpHeaderField
30
               [Fragment]
31 17 Davide Pesavento
32 47 Junxiao Shi
    LpHeaderField = Sequence
33 17 Davide Pesavento
34 47 Junxiao Shi
    Sequence = SEQUENCE-TYPE TLV-LENGTH 8OCTET
35 17 Davide Pesavento
36 47 Junxiao Shi
    Fragment = FRAGMENT-TYPE TLV-LENGTH 1*OCTET
37 17 Davide Pesavento
38 53 Davide Pesavento
Outermost packet transmitted on a NDNLPv2 link is **LpPacket**.
39 16 Junxiao Shi
In addition, a host MUST also accept bare network packets (Interest and Data) on a NDNLPv2 link, which SHOULD be interpreted as an LpPacket with the bare network packet as its Fragment. However, such packets could be dropped later in processing if the link configured to require a certain NDNLPv2 feature but a field is missing.
40 2 Alex Afanasyev
41
**LpHeaderField** is a repeatable optional structure in LpHeader.
42
NDNLPv2 features MAY add new header fields by extending the definition of LpHeaderField.
43
Unless otherwise specified, the same field shall appear at most once.
44
Unless otherwise specified, fields MUST appear in the order of increasing TLV-TYPE codes.
45
46
If an incoming LpPacket contains an unknown LpHeaderField, the following rules apply:
47
48 27 Davide Pesavento
1. if the unknown field is in the range `[800, 959]` and the two least significant bits are both zero, the receiver SHOULD ignore the field and continue processing the packet;
49 2 Alex Afanasyev
2. otherwise, the receiver MUST drop the packet, but SHOULD NOT consider the link has an error.
50
51 27 Davide Pesavento
Note: if a field is recognized but the relevant feature is disabled, it's not considered "unknown".
52 2 Alex Afanasyev
53
**Sequence** contains a sequence number that is useful in multiple features.
54
This field is REQUIRED if any enabled feature is using sequence numbers, otherwise it's OPTIONAL.
55 48 Davide Pesavento
Bit width of the sequence number is determined on a per-link basis, 8 octets are recommended for today's links.
56 2 Alex Afanasyev
A host MUST generate consecutive sequence numbers for outgoing packets on the same face.
57
58
**Fragment** contains a fragment of one or more network layer packets.
59 1 Junxiao Shi
The fragmentation and reassembly feature defines how Fragment field is constructed and interpreted.
60 2 Alex Afanasyev
When fragmentation and reassembly feature is disabled, the Fragment field contains a whole network layer packet.
61 1 Junxiao Shi
Fragment is OPTIONAL; an LpPacket without Fragment is an **IDLE packet**.
62
63 2 Alex Afanasyev
## Indexed Fragmentation
64
65
Indexed fragmentation provides fragmentation and reassembly feature on datagram links that do not guarantee in-order delivery.
66
67
This feature defines two header fields:
68
69 47 Junxiao Shi
    LpHeaderField =/ FragIndex / FragCount
70 2 Alex Afanasyev
71 59 Davide Pesavento
    FragIndex = FRAG-INDEX-TYPE TLV-LENGTH NonNegativeInteger
72 1 Junxiao Shi
73 59 Davide Pesavento
    FragCount = FRAG-COUNT-TYPE TLV-LENGTH NonNegativeInteger
74 2 Alex Afanasyev
75 14 Davide Pesavento
The sender slices a network layer packet into one or more fragments.
76
The size of each fragment MUST be small enough so that the LpPacket carrying every fragment is below the link MTU.
77 2 Alex Afanasyev
It is RECOMMENDED that all except the last fragments have the same size.
78
79
**FragCount** field indicates the number of fragments belonging to the same network layer packet.
80
It MUST be the same in all fragments belonging to the same network layer packet.
81
82
**FragIndex** field indicates the zero-based index of the current packet.
83
It MUST be assigned consecutively for fragments belonging to the same network layer packet, starting from zero.
84
The feature is named "indexed fragmentation" because every fragment is given an index in this field.
85
86
**Sequence** field is REQUIRED when this feature is enabled.
87
Fragments belonging to the same network layer packet MUST be assigned consecutive sequence numbers, in the same order with FragIndex.
88
89
For example, a 5000-octet network layer packet may be sliced as illustrated:
90
91
    +-------------+-------------+    +-------------+-------------+
92
    | LpPacket    | Fragment    |    | LpPacket    | Fragment    |
93
    | seq=8801    |             |    | seq=8802    |             |
94
    | FragIndex=0 | [0:1400]    |    | FragIndex=1 | [1400:2800] |
95
    | FragCount=4 |             |    | FragCount=4 |             |
96
    +-------------+-------------+    +-------------+-------------+
97
98
    +-------------+-------------+    +-------------+-------------+
99 1 Junxiao Shi
    | LpPacket    | Fragment    |    | LpPacket    | Fragment    |
100 2 Alex Afanasyev
    | seq=8803    |             |    | seq=8804    |             |
101
    | FragIndex=2 | [2800:4200] |    | FragIndex=3 | [4200:5000] |
102
    | FragCount=4 |             |    | FragCount=4 |             |
103
    +-------------+-------------+    +-------------+-------------+
104 1 Junxiao Shi
105 14 Davide Pesavento
The receiver stores fragments in a *PartialMessageStore* data structure, which is a collection of PartialMessages, indexed by MessageIdentifier=Sequence-FragIndex.
106 1 Junxiao Shi
Since both Sequence and FragIndex are assigned consecutively, MessageIdentifier would be the sequence number of the first fragment of a network layer packet.
107 14 Davide Pesavento
After collecting all fragments belonging to a network layer packet, the receiver stitches them together, and delivers the complete network layer packet to the upper layer.
108 2 Alex Afanasyev
109 14 Davide Pesavento
The receiver SHOULD maintain a reassembly timer for each PartialMessage, which is reset each time a new fragment is received.
110 2 Alex Afanasyev
If this timer expires, the PartialMessage is dropped.
111 14 Davide Pesavento
The default duration of this timer is 500ms.
112 2 Alex Afanasyev
113 1 Junxiao Shi
If this feature is enabled but FragIndex is missing, it is assumed to be 0 (zero).
114 14 Davide Pesavento
If this feature is enabled but FragCount is missing, it is assumed to be 1 (one).
115 1 Junxiao Shi
If this feature is disabled but either header field is received, the packet MUST be dropped.
116
117 14 Davide Pesavento
Unless otherwise specified, header fields from other features MUST appear only in the first fragment.
118 2 Alex Afanasyev
If a header field appears on a subsequent fragment, it MUST be ignored, unless otherwise specified.
119
120
## Network NACK
121
122
A network NACK is a forwarding instruction from upstream to downstream that indicates the upstream is unable to satisfy an Interest.
123
124
This feature defines a header field:
125
126 47 Junxiao Shi
    LpHeaderField =/ Nack
127 2 Alex Afanasyev
128 47 Junxiao Shi
    Nack = NACK-TYPE TLV-LENGTH [NackReason]
129 2 Alex Afanasyev
130 59 Davide Pesavento
    NackReason = NACK-REASON-TYPE TLV-LENGTH NonNegativeInteger
131 2 Alex Afanasyev
132
**Nack** header field indicates an Interest is a NACK, and is not a normal Interest.
133
The receiver MUST NOT process the packet as an Interest.
134
135
**NackReason** element MAY be included to indicate why the NACK is transmitted.  
136
The following NackReason values are defined:
137
138
Code  | Reason       | Description
139
----- | ------------ | --------------------------------------------------------------
140
0     | None         | (reserved)
141
50    | Congestion   | there is a congestion in the link between upstream and downstream, or on the best-known path between upstream and content source
142
100   | Duplicate    | the upstream has detected a duplicate Nonce in the Interest sent by the downstream
143
150   | NoRoute      | the upstream has no path to reach a content source due to routing problem or link failure
144
145
A receiver MUST be prepared to process a NACK without a reason.  
146
If NackReason element contains an unrecognized reason, the receiver MUST treat this NACK as a NACK without reason, and MUST NOT drop the packet.
147
148
Example of NACK of an Interest for `/example` with NACK reason "Duplicate":
149
150
    +--------------------------+---------------+
151
    | LpPacket                 | Interest      |
152 1 Junxiao Shi
    |                          | Name=/example |
153 2 Alex Afanasyev
    | +-Nack-----------------+ | Nonce=35      |
154 1 Junxiao Shi
    | | NackReason=Duplicate | |               |
155 2 Alex Afanasyev
    | +----------------------+ |               |
156
    +--------------------------+---------------+
157
158
It's RECOMMENDED to enable this feature on every link.  
159
If this feature is disabled but Nack is received, the packet MUST be dropped.
160
161
Nack header field is permitted only on an LpPacket carrying an Interest.  
162
When Nack appears on an LpPacket carrying a network layer packet other than an Interest, the packet MUST be dropped.
163 13 Davide Pesavento
164 54 Davide Pesavento
## PIT Token
165
166
    LpHeaderField =/ PitToken
167
168
    PitToken = PIT-TOKEN-TYPE TLV-LENGTH 1*32OCTET
169
170
The **PitToken** field is similar to the "Interest digest" as described in #3333, but it is hop-by-hop and does not require universal agreement.
171
A downstream attaches one or more bytes as the TLV-VALUE of this field when transmitting an Interest. These bytes are opaque to the upstream.
172
When the upstream responds to this Interest with a Data or Nack packet, it SHALL attach a PitToken field with the same bytes.
173
The downstream MUST verify these bytes before assuming the Data/Nack matches the Interest.
174
175 2 Alex Afanasyev
## Consumer-Controlled Forwarding
176 13 Davide Pesavento
177 2 Alex Afanasyev
Consumer-controlled forwarding allows a local consumer application to explicitly specify the nexthop face to forward an Interest.
178
179
This feature defines a header field:
180
181 47 Junxiao Shi
    LpHeaderField =/ NextHopFaceId
182 2 Alex Afanasyev
183 59 Davide Pesavento
    NextHopFaceId = NEXT-HOP-FACE-ID-TYPE TLV-LENGTH NonNegativeInteger
184 1 Junxiao Shi
185 2 Alex Afanasyev
**NextHopFaceId** indicates the nexthop FaceId to which an Interest should be forwarded.
186 1 Junxiao Shi
A local consumer application MAY add this field to an LpPacket carrying an Interest.
187 2 Alex Afanasyev
The local forwarder SHOULD follow this instruction and forward the Interest to the specified nexthop, after ContentStore lookup does not find a match.
188 1 Junxiao Shi
189 2 Alex Afanasyev
This feature is designed to be used on local faces only.
190
It SHOULD NOT be enabled on non-local faces.
191
If this feature is enabled but NextHopFaceId refers to a non-existent face, the Interest SHOULD be processed as if there is no available route.
192
If this feature is disabled but NextHopFaceId is received, the packet SHOULD be dropped, or this field MUST be ignored.
193
194 16 Junxiao Shi
NextHopFaceId header field is permitted only on an LpPacket carrying an Interest, from an application to the forwarder.
195 2 Alex Afanasyev
When NextHopFaceId appears on an LpPacket carrying a network layer packet other than an Interest, the packet MUST be dropped.
196
When NextHopFaceId appears on an LpPacket that has a Nack header field, the packet SHOULD be dropped.
197
When NextHopFaceId is received by an application from a forwarder, this field MUST be ignored.
198
199 51 Davide Pesavento
## Incoming Face Indication
200
201
Incoming face indication feature allows the forwarder to inform local applications about the face on which a packet is received.
202
203
This feature defines a header field:
204
205
    LpHeaderField =/ IncomingFaceId
206
207 59 Davide Pesavento
    IncomingFaceId = INCOMING-FACE-ID-TYPE TLV-LENGTH NonNegativeInteger
208 51 Davide Pesavento
209
**IncomingFaceId** contains the FaceId from which the network layer packet is received.
210 60 Davide Pesavento
When this feature is enabled, the forwarder SHOULD attach this field to every network layer packet going to a local application, and indicate the FaceId on which this network layer packet was received by the forwarder.
211 51 Davide Pesavento
If a Data packet comes from the ContentStore, IncomingFaceId SHOULD contain a special FaceId that represents the ContentStore, rather than the FaceId on which this Data packet was originally received.
212 60 Davide Pesavento
Even if this feature is enabled, the application MUST be prepared to receive a packet without an IncomingFaceId field.
213 51 Davide Pesavento
214
This feature is designed to be used on local faces only.
215
It SHOULD NOT be enabled on non-local faces.
216
217
IncomingFaceId header field is permitted only on an LpPacket from the forwarder to an application.
218
When IncomingFaceId is received by the forwarder from an application, this field MUST be ignored.
219
220 2 Alex Afanasyev
## Local Cache Policy
221
222
Local cache policy feature allows a local producer application to instruct ContentStore on whether and how to cache a Data packet.
223
224
This feature defines a header field:
225
226 47 Junxiao Shi
    LpHeaderField =/ CachePolicy
227 2 Alex Afanasyev
228 47 Junxiao Shi
    CachePolicy = CACHE-POLICY-TYPE TLV-LENGTH CachePolicyType
229 2 Alex Afanasyev
230 59 Davide Pesavento
    CachePolicyType = CACHE-POLICY-TYPE-TYPE TLV-LENGTH NonNegativeInteger
231 2 Alex Afanasyev
232
**CachePolicy** header field gives a suggestion to the ContentStore.
233
The ContentStore MAY follow this suggestion.
234
235
**CachePolicyType** element MUST be included to indicate the suggestion.
236
The following CachePolicyType values are defined:
237
238
Code | Policy  | Description
239
-----|---------|--------------------------------
240
0    | None    | (reserved)
241
1    | NoCache | ContentStore SHOULD NOT admit the Data packet
242
243
If CachePolicyType field contains an unknown policy code, the forwarder SHOULD drop the packet.
244 1 Junxiao Shi
245 2 Alex Afanasyev
The design places the policy code in the CachePolicyType element nested under CachePolicy, instead of having the code appear directly in CachePolicy header field, because in the future other policies that require additional arguments can be defined, and those arguments can appear as elements after CachePolicyType.
246
247
Example for a Data packet with "NoCache" policy:
248
249
    +-----------------------------+---------------+
250 47 Junxiao Shi
    | LpPacket                    | Data          |
251 2 Alex Afanasyev
    |                             | Name=/example |
252 47 Junxiao Shi
    | +-CachePolicy-------------+ | Content=xxxx  |
253 2 Alex Afanasyev
    | | CachePolicyType=NoCache | | Signature=xx  |
254
    | +-------------------------+ |               |
255
    +-----------------------------+---------------+
256
257 1 Junxiao Shi
This feature is designed to be used on local faces only.
258 2 Alex Afanasyev
It SHOULD NOT be enabled on non-local faces.
259 1 Junxiao Shi
If this feature is disabled but CachePolicy is received, this field MUST be ignored.
260 2 Alex Afanasyev
261 1 Junxiao Shi
CachePolicy header field is permitted only on an LpPacket carrying a Data packet, from an application to the forwarder.
262 2 Alex Afanasyev
When CachePolicy header field appears on an LpPacket carrying a network layer packet other than a Data packet, the packet MUST be dropped.
263
When CachePolicy is received by an application from a forwarder, this field MUST be ignored.
264
265 1 Junxiao Shi
## Congestion Marking
266
267 5 Eric Newberry
A host can signal the current congestion state to other hosts using the **CongestionMark** field. A value of 0 indicates *no congestion*; a value greater than 0 indicates some level of congestion. The exact meaning of the bits in this field is left up to the congestion control strategy in use.
268 1 Junxiao Shi
269
This features defines a header field:
270 5 Eric Newberry
271 47 Junxiao Shi
    LpHeaderField =/ CongestionMark
272 5 Eric Newberry
273 59 Davide Pesavento
    CongestionMark = CONGESTION-MARK-TYPE TLV-LENGTH NonNegativeInteger
274 1 Junxiao Shi
275 5 Eric Newberry
## Link Layer Reliability
276 9 Eric Newberry
277
To provide increased reliability and indicate potential congestion on a unicast link, a sender can expect frames successfully received by another host to be acknowledged.
278 14 Davide Pesavento
279 53 Davide Pesavento
After sending a link-layer frame (potentially fragmented, as described above), a host will expect an **Ack** field to be received on a frame returned in the opposite direction. This field will contain the **TxSequence** of the acknowledged frame. TxSequence numbers are assigned sequentially on the link, and are independent of the sequence number of the stored fragment. If the host does not receive this acknowledgement within the RTO (determined using the formula described below) and the frame has not been retransmitted more than a pre-determined number of times (the maximum number of retransmissions), the frame will be retransmitted on the link with the same sequence number, but a new TxSequence. In addition, if a configurable number of Acks (three by default) for greater TxSequences are received by the sender of the frame, the frame will be considered lost and the previously discussed retransmission logic will be followed.
280 15 Eric Newberry
281 9 Eric Newberry
To facilitate the retransmission of frames, each frame will be cached on the sender until it is acknowledged, at which point it can be deleted from the cache. The sender also keeps track of which frames were fragmented from which network-layer packet (if fragmentation occurred) and which unacknowledged TxSequences reference which transmitted frame. If one fragment of a network-layer packet exceeds the maximum number of retransmissions, the RTO timers of all fragments in the packet will be cancelled, all fragments of the packet will be deleted from the frame cache, and the entire packet will be considered lost. The sender will keep track of which sequence numbers are associated with which network-layer packets.
282 14 Davide Pesavento
283 57 Eric Newberry
The receiver will extract the TxSequence of every received frame and will insert these numbers into a queue of pending Acks destined for the sender. When a frame is being transmitted in the opposite direction, any excess space under the MTU will be filled with TxSequences removed from this queue. An idle Ack timer is used to handle links that have gone idle. If a packet with a TxSequence is received and the packet has not been started, or has expired, the timer is started with a period of 5ms (or another configurable non-zero time period). Upon expiration of the timer, all Acks in the queue will be sent in IDLE packets. The receiver will also track the fragment sequence numbers of received non-IDLE frames for 1x the estimated RTO at the time of receipt. If the fragment sequence number of a received packet matches a recently received fragment sequence number, the fragment contained within will be dropped, but its TxSequence will be acknowledged to the sender and any Acks contained within the frame will be processed.
284 11 Eric Newberry
285 9 Eric Newberry
The RTO is determined using the standard TCP formula: `RTO = SRTT + 4 * RTTVAR`. The round-trip time (RTT) of a packet is measured as the difference between the time the frame was transmitted and when an Ack was received for it. Frames that have been retransmitted are not taken into account by this formula.
286 12 Eric Newberry
287
Multiple Ack fields can be sent in one LpPacket. If an Ack is received for an unknown TxSequence, the Ack will be ignored.
288
289 47 Junxiao Shi
    LpHeaderField =/ TxSequence / Ack
290 1 Junxiao Shi
291
    TxSequence = TX-SEQUENCE-TYPE TLV-LENGTH 8OCTET
292 47 Junxiao Shi
293 9 Eric Newberry
    Ack = ACK-TYPE TLV-LENGTH 8OCTET
294 57 Eric Newberry
295
The **Sequence** field is required on any non-IDLE frames transmitted on a link while reliability is enabled.
296 1 Junxiao Shi
297 62 Davide Pesavento
*Modified from "Hop-By-Hop Best Effort Link Layer Reliability in Named Data Networking" by S. Vusirikala, et al.*
298 45 Davide Pesavento
299 1 Junxiao Shi
## Self-Learning Forwarding Support
300 23 Junxiao Shi
301 1 Junxiao Shi
[NDN self-learning](https://named-data.net/publications/on_broadcast-based_self-learning_ndn/) is a forwarding protocol that can automatically discover contents and forwarding paths in local area networks. This feature adds two hop-by-hop headers to support this forwarding protocol.
302 23 Junxiao Shi
303 47 Junxiao Shi
    LpHeaderField =/ NonDiscovery / PrefixAnnouncement
304 23 Junxiao Shi
305 47 Junxiao Shi
    NonDiscovery = NON-DISCOVERY-TYPE
306
                   TLV-LENGTH ; == 0
307 23 Junxiao Shi
308 52 Davide Pesavento
    PrefixAnnouncement = PREFIX-ANNOUNCEMENT-TYPE TLV-LENGTH Data
309 28 Teng Liang
310 23 Junxiao Shi
Self-learning distinguishes an Interest as either "discovery" or "non-discovery". A node transmits a discovery Interest to explore new forwarding paths, or transmits a non-discovery Interest to exploit existing forwarding paths. The **NonDiscovery** field indicates an Interest is "non-discovery"; otherwise, an Interest without this field is "discovery".
311
This field can only appear on an Interest. If this field appears on a Data or a Nack, the LpPacket MUST be dropped. If the self-learning forwarding protocol support feature is disabled or the chosen forwarding strategy does not support self-learning, this field SHOULD be ignored.
312
313 43 Teng Liang
When replying to a discovery Interest, the upstream node SHOULD transmit the Data with a **PrefixAnnouncementHeader** field. This field indicates what name prefix the producer is serving, and assists the downstream node in updating its FIB. A PrefixAnnouncement contains a single Data TLV element, and the Data format follows the [[PrefixAnnouncement]] Protocol.
314 42 Davide Pesavento
315 43 Teng Liang
 
316 41 Teng Liang
This field can only appear on a Data. If this field appears on an Interest or a Nack, the LpPacket MUST be dropped. If the self-learning forwarding protocol support feature is disabled or the chosen forwarding strategy does not support self-learning, this field SHOULD be ignored.
317 22 Teng Liang
318 16 Junxiao Shi
## TLV-TYPE Number Assignments
319 2 Alex Afanasyev
320 58 Davide Pesavento
Type                     | number (dec)     | number (hex)
321 26 Davide Pesavento
-------------------------|------------------|------------------
322 25 Junxiao Shi
Fragment                 | 80               | 0x50
323
Sequence                 | 81               | 0x51
324 1 Junxiao Shi
FragIndex                | 82               | 0x52
325
FragCount                | 83               | 0x53
326 25 Junxiao Shi
HopCount (ndnSIM)        | 84               | 0x54
327 58 Davide Pesavento
GeoTag (ndnSIM)          | 85               | 0x55
328 55 Davide Pesavento
PitToken                 | 98               | 0x62
329 26 Davide Pesavento
LpPacket                 | 100              | 0x64
330 25 Junxiao Shi
Nack                     | 800              | 0x0320
331
NackReason               | 801              | 0x0321
332 61 Davide Pesavento
IncomingFaceId           | 812              | 0x032C
333 1 Junxiao Shi
NextHopFaceId            | 816              | 0x0330
334 61 Davide Pesavento
*Reserved, formerly IncomingFaceId*| 817    | 0x0331
335 25 Junxiao Shi
CachePolicy              | 820              | 0x0334
336
CachePolicyType          | 821              | 0x0335
337
CongestionMark           | 832              | 0x0340
338
Ack                      | 836              | 0x0344
339
TxSequence               | 840              | 0x0348
340 20 Davide Pesavento
NonDiscovery             | 844              | 0x034C
341 2 Alex Afanasyev
PrefixAnnouncement       | 848              | 0x0350
342 1 Junxiao Shi
343 2 Alex Afanasyev
### Reserved Blocks
344
345 45 Davide Pesavento
Two blocks of TLV-TYPEs have been reserved by link protocols:
346 2 Alex Afanasyev
347 27 Davide Pesavento
* `[80, 100]`: 1-octet encoding
348
* `[800, 1000]`: 3-octet encoding
349 2 Alex Afanasyev
350 16 Junxiao Shi
TLV-TYPE numbers for LpHeaderField SHOULD be assigned according to the following rules:
351 2 Alex Afanasyev
352 27 Davide Pesavento
1. if the field can be safely ignored by a receiver that doesn't understand the field, pick an unused number in the range `[800, 959]` whose two least significant bits are `00`.
353
2. if the field would occur frequently, pick an unused number in the range `[81, 99]`.
354
3. otherwise, pick an unused number in the range `[800, 959]` whose two least significant bits are `01`.
355 2 Alex Afanasyev
356 16 Junxiao Shi
Note: number assignment for a TLV-TYPE nested within a LpHeaderField is not restricted by the above rules.