TCP-Sequenznummer

TCP-Sequenznummer

Ich möchte wissen, welches Segment akzeptiert wird, wenn zwei Segmente mit derselben Sequenznummer am Ziel ankommen?

Zum Beispiel:

Ein Client sendet ein Paket an einen Server und wartet auf eine Bestätigung. Da die Bestätigung jedoch nicht innerhalb der vorgegebenen Zeit empfangen wurde (aufgrund eines Netzwerkproblems dauert es eine Weile, bis dieses Segment den Server erreicht), beginnt er erneut, dasselbe Segment zu senden. Was passiert nun auf der Serverseite, wenn beide Pakete gleichzeitig ankommen?

Antwort1

Ein Paket wird als Duplikat markiert und verworfen. Da sie identisch sind, spielt es keine Rolle, welches das ist. Siehehttps://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication

Antwort2

Die Annahme, dass beide Segmente gleichzeitig eintreffen, ist nicht sinnvoll. Eines wird immer vor dem anderen eintreffen. Aber diese Daten sind möglicherweise erst dann an die Anwendung übermittelt worden, wenn das nächste eintrifft.

EntsprechendRFC 793Es sollen die Daten aus dem ersten Segment verwendet werden.

Segmente werden der Reihe nach verarbeitet. Erste Tests beim Eintreffen dienen dazu, alte Duplikate zu verwerfen, die weitere Verarbeitung erfolgt jedoch in der Reihenfolge SEG.SEQ. Wenn der Inhalt eines Segments die Grenze zwischen alt und neu überschreitet, sollten nur die neuen Teile verarbeitet werden.

Allerdings ist es nicht schwer, sich Implementierungen in der Realität vorzustellen, die sich anders verhalten. Insbesondere teilweise überlappende Segmente können recht interessant sein.

Antwort3

Grundsätzlich wird das zuerst verarbeitete Dokument akzeptiert; nachfolgende Duplikate werden gelöscht.

Aushttps://www.rfc-editor.org/rfc/rfc793.txt

...prüfen Sie zuerst die Sequenznummer

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

verwandte Informationen