Порядковый номер TCP

Порядковый номер TCP

Я хотел бы узнать, если два сегмента с одинаковым порядковым номером прибудут в пункт назначения, какой сегмент будет принят?

Например:

Клиент отправляет пакет на сервер и ждет подтверждения. Но он не получил подтверждение (из-за какой-то сетевой проблемы этот сегмент занимает время, чтобы достичь сервера) в течение временной шкалы, поэтому снова начинает отправлять тот же сегмент. Теперь на стороне сервера, что произойдет, если оба пакета достигнут одновременно.

решение1

Один пакет помечается как дубликат и отбрасывается. Поскольку они идентичны, неважно, какой из них. Смотритеhttps://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication

решение2

Предположение, что оба сегмента прибывают одновременно, не имеет смысла. Один всегда будет прибывать раньше другого. Но эти данные могли не быть доставлены в приложение до прибытия следующего.

В соответствии сRFC793будут использованы данные из первого сегмента.

Сегменты обрабатываются последовательно. Первоначальные тесты по прибытии используются для отбрасывания старых дубликатов, но дальнейшая обработка выполняется в порядке SEG.SEQ. Если содержимое сегмента выходит за пределы границы между старым и новым, обрабатываться должны только новые части.

Тем не менее, нетрудно представить, что реализации в реальности ведут себя по-другому. В частности, частично перекрывающиеся сегменты могут быть весьма интересными.

решение3

По сути, будет принят тот запрос, который будет обработан первым, последующие дубликаты будут отбрасываться.

От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...

Связанный контент