TCPヘッダーのシーケンス番号がどのように生成されるかを理解しようとしています。
「パケットの最初のバイトのインデックス」( リンクはこちら )であると読んだ場所もありますが、他のサイトではランダムに生成された32ビットの数値であるため増分されます。
どっちがどれなのかよく分からないので、ここにいくつかの質問があります:
RFC 6528 、 RFC 79 、および RFC 1948 のようなRFCを読みましたが、実際に実装されているものを理解できないようです。 。
「std」ステータスについて読みましたが、それでも...
前もって感謝します!
TCP接続の各エンドポイントは、送信パケットの開始シーケンス番号を確立し、接続確立の一部として送信するSYNパケットでこの番号を送信します。
開始シーケンス番号を選択する際に特定の手順に従うために、どちらの側にもrequirementはありません。オペレーティングシステムは好きなメカニズムを自由に使用できますが、一般的には乱数を選択する方が安全です。
その開始点から、両端から送信された各パケットには2つのシーケンス番号が含まれます。1つはパケットのストリーム内の場所を指定し、1つはバイト数を示すACKシーケンス番号received。両方の番号は、開始シーケンス番号によってオフセットされます。
Wikipedia でそれについてすべてを読んでください-もちろん、そのページで「シーケンス番号」を探して、すべての詳細を取得してください。
4.4BSD(およびほとんどのBerkeley派生の実装)では、システムが初期化されると、初期送信シーケンス番号は1に初期化されます。このプラクティスは、ホスト要件RFCに違反します。 (コード内のコメントは、これが間違っていることを認めています。)この変数は、0.5秒ごとに64,000ずつ増加し、約9.5時間ごとに0に戻ります。 (これは、4マイクロ秒ごとではなく、8マイクロ秒ごとに増分されるカウンターに対応しています。)さらに、接続が確立されるたびに、この変数は64,000ずつ増分されます。
0から4,294,967,295の間の乱数です。ただし、wiresharkツールでは、synは0として表示されます(相対表示を使用するため)。ただし、[編集]-> [設定]を実行すると、元のシーケンス番号を表示できます。 TCPプロトコル設定。次のシーケンス番号は、受信したACK番号(a)に基づいて増加します(a + 1になります)。受信したペイロードlen(l)に基づいて増加します(l + 1になります)。SYN/ FINフラグがアクティブになっている間はデータ/ペイロードは送信されません(SYNおよびFINの間にACKを1だけインクリメントします)。