同じシーケンス番号の 2 つのセグメントが宛先に到着した場合、どちらのセグメントが受け入れられるかを知りたいです。
例えば:
クライアントはサーバーにパケットを送信し、確認応答を待ちます。しかし、タイムライン内に確認応答を受信しなかったため (ネットワークの問題により、このセグメントがサーバーに到達するまでに時間がかかります)、同じセグメントを再度送信し始めます。サーバー側では、両方のパケットが同時に到達すると何が起こるでしょうか。
答え1
1つのパケットは重複としてマークされ、破棄されます。これらは同一なので、どちらが重複しているかは問題ではありません。https://stackoverflow.com/questions/12871760/パケット損失とパケット複製
答え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...