TCP序號

TCP序號

我想知道如果兩個具有相同序號的段到達目的地,哪一個段會被接受?

例如:

客戶端向伺服器發送資料包並等待確認。但它沒有在時間軸內收到確認(由於某些網路問題,該段需要時間才能到達伺服器),因此開始再次發送相同的段。現在在伺服器端,如果兩個資料包同時到達會發生什麼。

答案1

一個資料包被標記為重複並被丟棄。由於它們是相同的,所以哪一個並不重要。看https://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication

答案2

兩個段同時到達的前提是沒有意義的。一個人總是會先於另一個人到達。但在下一個資料到達之前,該資料可能尚未傳遞到應用程式。

根據RFC 793將使用第一段的數據。

片段依序處理。到達時的初始測試用於丟棄舊的重複項,但進一步的處理是按 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...

相關內容