Once the SACK loss recovery mechanism is negotiated for
during the 3WHS, it is implicitly assumed, that every
DupACK will also always return with SACK Blocks.
Based on the changed information contained in the SACK
blocks, only the lost segments are retransmitted by
SACK loss recovery.
When these DupACKs contain no SACK blocks, the
expectation would be to fall back to NewReno loss
recovery.
However, this is not actually checked, and in this
rare case (middlebox scrubbing SACK blocks, or
an issue with the opposite SACK implementation)
TCP would revert to RTO based, one-by-one loss
recovery.