Я хотел бы знать, прибудут ли два сегмента с одинаковым порядковым номером в пункт назначения, какой сегмент будет принят?
Например:
Клиенты отправляют пакет на сервер и ждут подтверждения. Но он не получил подтверждение (из-за какой-то сетевой проблемы этому сегменту требуется время, чтобы достичь сервера) в пределах временной шкалы, поэтому он снова начинает отправлять тот же сегмент. Теперь на стороне сервера, что произойдет, если оба пакета достигнут одновременно.
Один пакет помечается как дубликат и отбрасывается. Поскольку они идентичны, не имеет значения, какой именно. Видеть https://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication
Предположение, что оба сегмента появляются одновременно, не имеет смысла. Один всегда приходит раньше другого. Но эти данные могли не быть доставлены в приложение до прибытия следующего.
В соответствии с RFC 793 должны использоваться данные из первого сегмента.
Сегменты обрабатываются последовательно. Начальные тесты по прибытии используются для отбрасывания старых дубликатов, но дальнейшая обработка выполняется в порядке SEG.SEQ. Если содержимое сегмента пересекает границу между старым и новым, обрабатывать должны только новые части.
Тем не менее, нетрудно представить, чтобы реализации в реальности вели себя по-другому. В частности, могут быть весьма интересны частично перекрывающиеся сегменты.
Обычно принимается то, что обрабатывается первым, а последующие дубликаты удаляются.
Из https://www.rfc-editor.org/rfc/rfc793.txt
... сначала проверьте порядковый номер
SYN-RECEIVED STATE
ESTABLISHED STATE
FIN-WAIT-1 STATE
FIN-WAIT-2 STATE
CLOSE-WAIT STATE
CLOSING STATE
LAST-ACK STATE
TIME-WAIT STATE
Segments are processed in sequence. Initial tests on arrival
are used to discard old duplicates, but further processing is
done in SEG.SEQ order. If a segment's contents straddle the
boundary between old and new, only the new parts should be
processed.
There are four cases for the acceptability test for an incoming
segment:
Segment Receive Test
Length Window
------- ------- -------------------------------------------
0 0 SEG.SEQ = RCV.NXT
0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0 0 not acceptable
>0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
If the RCV.WND is zero, no segments will be acceptable, but
special allowance should be made to accept valid ACKs, URGs and
RSTs.
If an incoming segment is not acceptable, an acknowledgment
should be sent in reply (unless the RST bit is set, if so drop
the segment and return):
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>
After sending the acknowledgment, drop the unacceptable segment
and return...