web-dev-qa-db-ja.com

TCP=パケットヘッダーのシーケンス番号は循環しますか?

TCPヘッダーフィールドのシーケンス番号はハンドシェイク中にランダムに選択され、パケットが交換されるにつれて徐々に増加するため、2 ^ 32-initial_seq_no送信後に何が起こるのでしょうか?数値は折り返して0になるか、または初期値が再利用されますか(または以前の接続が停止した場所から新しい接続が初期化されますか)?

16
Sebi

それは0に行くのを包み込みます。 RFC 793 によれば:

実際のシーケンス番号空間は有限ですが、非常に大きいことを忘れないでください。このスペースの範囲は0〜2 ** 32-1です。スペースは有限であるため、シーケンス番号を扱うすべての演算は2 ** 32を法として実行する必要があります。この符号なし演算では、シーケンス番号の関係が2 ** 32-1から0に再び循環するときに保持されます。コンピュータのモジュロ演算にはいくつかの微妙な点があるため、そのような値の比較をプログラミングする際には細心の注意を払う必要があります。記号「= <」は「以下」(2 ** 32を法とする)を意味します。

19
jcbermu

シーケンス番号は循環して0になりますか?

はい。すべての詳細はTCP仕様 RFC 793-伝送制御プロトコル にあります。


シーケンス番号

実際のシーケンス番号空間は有限ですが、非常に大きいことを忘れないでください。このスペースの範囲は0〜2です32 -1。

スペースは有限なので、シーケンス番号を扱うすべての算術は2を法として実行されなければなりません32。この符号なし演算は、2から循環するシーケンス番号の関係を保持します。32 -再び1から0。

コンピュータのモジュロ演算にはいくつかの微妙な点があるため、そのような値の比較をプログラミングする際には細心の注意を払う必要があります。記号「= <」は「以下」を意味します(2を法とする32)。

ソース RFC 793-Transmission Control Protocol

17
DavidPostill

はい、折り返します。 Wikipedia または RFC132 で読むことができます。これは、ラップされたシーケンス番号から保護する方法を示しています。

引用させてください:

TCPタイムスタンプは、保護されたシーケンス番号(PAWS)と呼ばれるアルゴリズムで使用されます(詳細については、RFC 1323を参照してください)。 PAWSは、受信ウィンドウがシーケンス番号の折り返し境界を超えるときに使用されます。パケットが再送信される可能性がある場合は、「このシーケンス番号は最初の4 GBですか、それとも2番目ですか?」という質問に答えます。そして、タイムスタンプはタイを壊すために使用されます。

そして:

PAWSは、前述のRTTMメカニズムと同じTCP Timestampsオプションを使用し、受信したすべてのTCPセグメント(データおよびACKセグメントを含む)にタイムスタンプSEGが含まれていると想定します.TSval値が時間とともに減少しない単調である基本的な考え方は、この接続で最近受信されたタイムスタンプよりも小さいタイムスタンプSEG.TSvalで受信されたセグメントは、古い複製として破棄される可能性があるということです。

PAWSとRTTMの両方のメカニズムで、「タイムスタンプ」はモジュール式の32ビット空間の32ビット符号なし整数です。したがって、「未満」はTCP=シーケンス番号の場合と同じように定義され、同じ実装手法が適用されます。sとtがタイムスタンプ値の場合、s <t if 0 <(t -s)<2 ** 31、符号なし32ビット演算で計算されます。

7
MariusMatutiae