20210108 NFD call discussed this problem regarding the use of Nack~Duplicate.
Recommended Procedure from 20161027¶
In the procedure given in Nack-duplicate_20161027.docx
(#1966-7) Recommendation of Nack-Duplicate processing section (implemented in NDN-DPDK as of end of 2020), this problem is solved as follows:
- time=0: Interest with nonceB is expressed on node B, and is forwarded to node A and node D
- time=10: Interest with nonceB arrives node A on B-A link, and is forwarded to node C
- time=10: Interest with nonceB arrives node D on B-D link, and is forwarded to node A
- time=15: similar Interest with nonceE is expressed on node E, and is forwarded to node D
- time=20: Interest with nonceB arrives node C on A-C link, and is answered
- time=20: Interest with nonceB arrives node A on D-A link, and is dropped because it has a duplicate Nonce; A returns a Nack~Duplicate to D
- time=25: Interest with nonceE arrives node D on E-D link, and is aggregated to the existing PIT entry because it's similar
- time=30: Data arrives node A, and is returned to node B, but not to node D
- time=30: Nack~Duplicate with nonceB arrives node D on A-D link; D sends Interest with nonceE to node A
- time=40: Data arrives node B on A-B link, and is not forwarded
- time=40: Interest with nonceE arrives node A on D-A link, and is answered with cached Data
- time=50: Data arrives node D on A-D link, and is returned to node E
- time=60: Data arrives node E on D-E link, and is not forwarded
NFD 0.7.1 Behavior¶
There have been recurring complaints against Nack~Duplicate in NFD, especially in the context of multicast strategy and data synchronization protocols.
The main reason is that, NFD is not implementing the 20161027 recommendation.
Instead, in step 6 node A returns the Nack~Duplicate to D, but in step 9 node D does not resend the Interest with nonceE to node A.
It's worth noting that merely deleting the Nack packet would not solve the original problem, as mentioned in the issue description.
Return Data to Every Downstream¶
This is one of the alternatives considered at 20210108 NFD call.
It would behave as follows:
- time=0: Interest with nonceB is expressed on node B, and is forwarded to node A and node D
- time=10: Interest with nonceB arrives node A on B-A link, and is forwarded to node C
- time=10: Interest with nonceB arrives node D on B-D link, and is forwarded to node A
- time=15: similar Interest with nonceE is expressed on node E, and is forwarded to node D
- time=20: Interest with nonceB arrives node C on A-C link, and is answered
- time=20: Interest with nonceB arrives node A on D-A link, and is aggregated to the existing PIT entry because it's similar
- time=25: Interest with nonceE arrives node D on E-D link, and is aggregated to the existing PIT entry because it's similar
- time=30: Data arrives node A, and is returned to node B and node D
- time=40: Data arrives node B on A-B link, and is not forwarded
- time=40: Data arrives node D on A-D link, and is returned to node E
- time=50: Data arrives node E on D-E link, and is not forwarded
In this approach, the Nonce field is unnecessary and can be eliminated.
The above steps still contain the Nonce field for identifying the packet, but it does not participate in the algorithm.
No Interest Aggregation¶
This is one of the alternatives considered at 20210108 NFD call.
It would behave as follows:
- time=0: Interest with nonceB is expressed on node B, and is forwarded to node A and node D
- time=10: Interest with nonceB (from step 1) arrives node A on B-A link, and is forwarded to node C
- time=10: Interest with nonceB (from step 1) arrives node D on B-D link, and is forwarded to node A
- time=15: similar Interest with nonceE is expressed on node E, and is forwarded to node D
- time=20: Interest with nonceB (from step 2) arrives node C on A-C link, and is answered
- time=20: Interest with nonceB (from step 3) arrives node A on D-A link, and is forwarded again to node C
- time=25: Interest with nonceE (from step 4) arrives node D on E-D link, and is forwarded again to node A
- time=30: Data (from step 5) arrives node A, and is returned to node B and node D
- time=30: Interest with nonceB (from step 6) arrives node C on A-C link, and is answered
- time=35: Interest with nonceE (from step 7) arrives node A on D-A link, and is answered with cached Data
- time=40: Data (from step 8) arrives node B on A-B link, and is not forwarded
- time=40: Data (from step 8) arrives node D on A-D link, and is returned to node E
13: time=40: Data (from step 9) arrives node A on C-A link, and is dropped because there's no PIT entry
- time=45: Data (from step 10) arrives node D on A-D link, and is dropped because there's no PIT entry
- time=50: Data (from step 12) arrives node E on D-E link, and is not forwarded