The TCPv4 specification (RFC 793) classifies a received segment as unacceptable if it has zero length, a sequence number equal to
RCV.WND while the receive window is not zero (second row in the table).
This essentially means that the segment will be discarded, other than possibly sending an
ACK processing or send window update will be done.
What is the justification of this?
Consider this scenario:
- Host A sends all possible data segments to host B, just exhausting the receive window of B.
- Host A shortly also sends an empty segment, e.g. a window update or acknowledgement of received data. This segment has sequence number equal to the right edge of the receive window of host B (
RCV.WND), since it was set to the latest
SND.NXTof host A.
- The mentioned data packets are lost in the network or delayed, and host B receives the empty segment first.
- Host B will classify the empty segment as not acceptable, and drop it, ignoring any acknowledgement or window update.
This seems to be particularly problematic, because the receiver will typically ignore seemingly older window updates based on the combination of sequence number and acknowledgement number. But just those window updates that won't get filtered out (highest sequence number) would be dropped even earlier due to segments not being considered acceptable.
Is there some part that I am not understanding correctly? Is this scenario really possible?