Feature #1913
Updated by Junxiao Shi over 10 years ago
Currently, BestRoute v.2 strategy uses a fixed time interval to suppress any potential retransmissions** from client side. This is used in interest of preventing accidental/malicious clients from sending Interest end-to-end. ** retransmission = similar interest received from the face it was received before. On p2p links it is guaranteed to be retransmission, on multicast links it may be necessary to use lower-layer identities to determine the retransmission event. However, fixing the interval removes ability for low-RTT communication to retrieve data when losses happen. Enabling RTT estimation could be a potential option, but given that this estimation would never be reliable (even if granularity of the estimation was data packet), multi-path nature of Interest forwarding and caches would make such estimation close to useless). Another point against using RTT is that the clients themselves be using RTT estimation to detect losses, which results in double-control loop and potentially unstable behavior. Alternative and simpler approach is to use exponential back-off approach with some short (fixed or "estimated") value. This way, we still give the end-clients control over the retransmission, but effectively prevent abuse of the mechanism. Detailed steps for the proposal: - Set `INITIAL_SUPPRESSION_INTERVAL` = 1ms (or even lower) - Define `SuppressionInfo` class derived from `StrategyInfo` to hold `time::Duration` and `time::steady_clock::TimePoint` values: class SuppressionInfo { ... public: time::Duration suppessionInterval; time::steady_clock::TimePoint suppressUntil; }; - On incoming interest: * if new PIT entry + install `SuppressionInfo` on PIT entry, initializing suppessionInterval = `INITIAL_SUPPRESSION_INTERVAL` INITIAL_SUPPRESSION_INTERVAL suppressUntil = time::steady_clock::now() + suppessionInterval + proceed with normal Interest processing * if retransmission detected + retrieve StrategyInfo from PIT entry + if `suppressUntil` larger or equal to `time::steady_clock::now()` abort processing + otherwise update `SuppressionInfo` values: suppessionInterval = 2 * suppessionInterval suppressUntil = time::steady_clock::now() + suppessionInterval + proceed with normal Interest processing