IPフラグメントが8バイトの倍数でなければならない理由



Why Ip Fragments Must Be Multiples 8 Bytes



解決:

最後を除くすべてのフラグメントには、8バイトの倍数のデータが含まれている必要があります。

フラグメントオフセットは8192(2 ^ 13)ユニットを保持できますが、IPヘッダーの「TotalLength」フィールドにはヘッダーとデータを含む合計サイズが記録されるため、データグラムに8192 * 8 = 65536バイトのデータを含めることはできません。



IPヘッダーの長さは少なくとも20バイトであるため、「フラグメントオフセット」の最大値は8189に制限されており、最後のフラグメントに3バイトのスペースが残されています。

お役に立てれば。




フラグメントオフセットフィールドは、バイトではなく8バイト単位で表されることに注意してください。これが、最後のフラグメントを除く各フラグメント内のペイロードサイズが8バイトの倍数でなければならない理由です。

フラグメントオフセットは13ビットでコード化されているため、その範囲は0〜8191ユニットの8バイトになります。ただし、全長はIPヘッダーも考慮に入れるため、フラグメントオフセットの最大制限は実際には8191ユニットではなく、8189ユニットです。以下を参照してください。

全長は16ビットでコード化されているため、65535バイトに制限されています。次に、IPヘッダーが少なくとも20バイトであるため、ペイロードは最大65535バイトに制限されます-20バイト= 65515バイト。これらの65515バイトを8バイト単位で分割すると、最大8189単位になる可能性があるため、フラグメンテーションオフセットは最大8189単位に制限されます。



フラグメントオフセット値がこの最大値8189に設定されているIPフラグメントは、最大3バイトのペイロードを持つことができます。

最大65535バイト-最小20バイト-(8189ユニット*ユニットあたり8バイト)=最大3バイト

ルレ


私はここで他の答えから多くの利益を得ませんでした。彼らは、彼らが見ている別の問題を説明しようとしている間、通過するだけで本当の問題をブラッシングしているように見えるので、ここに本当の答えがあります:

メッセージ長フィールドのビット数は、フラグメントフィールドのビット数とは異なります。

[ 長さ ]<-- 16 bits [ Flag ][ Fragment ] <-- 3 bits + 13 bits  

[メッセージの長さ]フィールドは、メッセージのすべてのフラグメントにわたって、メッセージ全体を測定します

大きなパケットを送信すると、複数のフラグメントに分割されるため、フラグメントにラベルを付け、そのフラグメント内のメッセージの部分を追跡し、すべてのフラグメントが到着したら元の順序に戻す必要があります。フラグメントのシーケンスを記述するために13ビットを取得します。 長さ は16ビット整数であるため、その容量(16ビット)は次のようになります。2 ^ 16-1 =65536-1 =65535。これにより65535の異なるバイトが得られるため、IPメッセージの長さは最大65535バイトになります。

フラグメントオフセットはバイトの尺度ですが、メッセージのバイト数に適合できません

理想的には、と同じ単位でフラグメントを測定したい 長さ 、これは バイト

しかし、フラグメントには13ビットしかありません!

彼らはフラグメントオフセットの測定値をバイト単位で維持したかったので、16ビットを13ビットに収める方法を考えなければなりませんでした。彼らは彼らのためにこれを行うために奇妙なビットマッピングを発明しました:

奇妙なビットマッピング

彼らは、最大数を表すために1ビット少ない数ごとに(たとえば、1ビットを取り除いて16ビットから15ビットに減らす)、持つことができる一意のインデックスの数を2で割ることに気づきました。 。15ビットは表すことしかできません2 ^ 15-1 =32768-1 =32767の一意の場所。 14ビット->もう一度2で割ります。 13ビット->もう一度2で割ります。同じ合計バイト数を追跡​​できるようにするには、一部のバイトをスキップして、すべてのバイトにのみインデックスを付ける必要があります。2 ^ nバイト。ここで、nはフラグメントオフセット値から取り出されたビット数です。 13を使用するにはフラグメントオフセットが必要なため、3ビットが削除され、8バイト(2 ^ 3)ごとにしかインデックスを作成できません。したがって、インデックスは8バイトのチャンク用でした。したがって、8 *各フラグメントの実際のバイトオフセットを計算するためのフラグメントオフセット。

考慮事項

フラグメント値は、最初のフラグメントの最初のバイトからのオフセットです。奇妙な理由で、バイトはインデックスよりも多くのデータを必要としますが、フラグメントの数ではなく、バイト単位でオフセットを測定することにしました。単純に作成する方が賢明かもしれません フラグメントオフセット NS インデックス値 (フラグメント番号)-しかし、彼らはこのようにはしませんでした!