TCPパケットヘッダーのシーケンス番号は折り返しますか?


16

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

回答:


19

0に移動します。RFC793によると:

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


3
すべての数値が2 ** 32を法とする他のすべての数値以下である
...-user253751

2
@ user20574これが、TCPウィンドウサイズが1GBより大きくなることを許可されていない理由です。シーケンス番号の比較は、最短で回避する必要があります(つまり、差は-2 ^ 31から2 ^ 31の範囲でなければなりません)。
カスペルド

17

シーケンス番号は折り返されて0になりますか?

はい。TCP仕様RFC 793-Transmission Controlプロトコルですべての詳細を見つけることができます。


シーケンス番号

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

空間は有限であるため、シーケンス番号を扱うすべての算術は2 32を法として実行する必要があります。この符号なし算術は、シーケンス番号が2 32-1から0に再び循環するときに、シーケンス番号の関係を保持します。

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

ソースRFC 793-伝送制御プロトコル


1
私はメッセンジャーを撃つつもりはありませんが、「以下(モジュロN)」ですか?明らかに、RFCの作者は「コンピューターモジュールの算術の微妙さ」を見逃していました。
ベンフォークト

最大ウィンドウが2 ^ 31未満の場合x、およびyがタイプの場合、mean uint32_tを定義するのが実用的です。x<=y(uint32_t)(y-x) < 0x80000000
supercat

@BenVoigt、MORおそらく彼らは、後のRFCに記載されたものを付与するためにかかったtools.ietf.org/html/rfc1982
カルステンS

有用な演算であるが、それは「算術モジュロN」ではない@Carsten
ベンフォークト

1
@BenVoigt、ええ、何でも。ところで、私はグループZ /(n)が順序付けられていないことをよく知っていますが、文脈の中でステートメントを解釈することもできます。
カールステンS

7

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

引用させてください:

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がタイムスタンプ値である場合、0 <(t-s)<2 ** 31の場合、s <t、符号なし32ビット演算で計算されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.