web-dev-qa-db-ja.com

TCPシーケンス番号

TCPヘッダーのシーケンス番号がどのように生成されるかを理解しようとしています。

「パケットの最初のバイトのインデックス」( リンクはこちら )であると読んだ場所もありますが、他のサイトではランダムに生成された32ビットの数値であるため増分されます。

どっちがどれなのかよく分からないので、ここにいくつかの質問があります:

  • 初期シーケンス番号はどのように生成されますか? (RFC番号がある場合は提供してください)
  • どのようにインクリメントされますか?
  • 秘密鍵はどのように生成されますか?

RFC 6528RFC 79 、および RFC 1948 のようなRFCを読みましたが、実際に実装されているものを理解できないようです。 。

「std」ステータスについて読みましたが、それでも...

前もって感謝します!

28
m_vdbeek

TCP接続の各エンドポイントは、送信パケットの開始シーケンス番号を確立し、接続確立の一部として送信するSYNパケットでこの番号を送信します。

開始シーケンス番号を選択する際に特定の手順に従うために、どちらの側にもrequirementはありません。オペレーティングシステムは好きなメカニズムを自由に使用できますが、一般的には乱数を選択する方が安全です。

その開始点から、両端から送信された各パケットには2つのシーケンス番号が含まれます。1つはパケットのストリーム内の場所を指定し、1つはバイト数を示すACKシーケンス番号received。両方の番号は、開始シーケンス番号によってオフセットされます。

Wikipedia でそれについてすべてを読んでください-もちろん、そのページで「シーケンス番号」を探して、すべての詳細を取得してください。

38
Michael Slade

4.4BSD(およびほとんどのBerkeley派生の実装)では、システムが初期化されると、初期送信シーケンス番号は1に初期化されます。このプラクティスは、ホスト要件RFCに違反します。 (コード内のコメントは、これが間違っていることを認めています。)この変数は、0.5秒ごとに64,000ずつ増加し、約9.5時間ごとに0に戻ります。 (これは、4マイクロ秒ごとではなく、8マイクロ秒ごとに増分されるカウンターに対応しています。)さらに、接続が確立されるたびに、この変数は64,000ずつ増分されます。

2
Joy

0から4,294,967,295の間の乱数です。ただし、wiresharkツールでは、synは0として表示されます(相対表示を使用するため)。ただし、[編集]-> [設定]を実行すると、元のシーケンス番号を表示できます。 TCPプロトコル設定。次のシーケンス番号は、受信したACK番号(a)に基づいて増加します(a + 1になります)。受信したペイロードlen(l)に基づいて増加します(l + 1になります)。SYN/ FINフラグがアクティブになっている間はデータ/ペイロードは送信されません(SYNおよびFINの間にACKを1だけインクリメントします)。

1
Khrusos