web-dev-qa-db-ja.com

IPフラグメンテーションと再構築

私は現在、ネットワーキングのスライドを調べていますが、断片化と再構築の概念について誰かが私を助けることができるかどうか疑問に思っていました。

enter image description here

ネットワークリンクにはMTUがあるため、それがどのように機能するか、つまりデータグラムがより小さいチャンクに分割される方法を理解しています。しかし、写真の例は私を混乱させています。

最初の2つのセクションの長さは1500です。これはMSUであるためですが、これは最後のセクションの長さが1040ではなく1000(合計4000バイト)であることを意味するものではありませんか?これらの余分な40バイトはどこから来たのですか?私の推測では、前の2つのフラグメントは両方とも20バイトのヘッダーを持っていたので、この余分な40バイトのデータはどこかに行く必要があったので、最後のフラグメントに到着しますか?

Fragflagは本質的に、別のフラグメントがあることを意味するため、ゼロになる最後のフラグメントを除いて、すべてのFragflagが1になります。しかし、私はオフセットが何であるか、またはそれがどのように計算されるか理解していません。最初のオフセットがゼロになっているのはなぜですか?データフィールドのバイト(1480)を8で割って2番目のオフセットを取得したのはなぜですか?この8はどこから来たのですか?それとは別に、私は各フラグメントのオフセットがこの値だけ増加すると仮定していますか?

たとえば、最初のフラグメントのオフセットは0、2番目の185、3番目の370、4番目の555? (370 + 185)

助けてくれてありがとう!

21
JimmyK

各パケットには20バイトのヘッダーがあります。したがって、元のパケットには3,980バイトのデータが含まれます。フラグメントには、1480、1480、および1020バイトのデータが含まれます。 1480 + 1480 + 1020 = 3980

ヘッダーのすべてのビットは貴重です。オフセットを8で割ると、16ではなく13ビットに収まります。これは、すべてのパケットが8の倍数のデータバイトを含む必要があることを意味しますが、これは問題ではありません。

19
David Schwartz

フラグメンテーションと再構成は、RFC 791でのみ説明されています。 Internet Protocol Specification RFC を確認してください。 RFCには、サンプルの断片化と再構成を説明するさまざまなセクションがあります。あなたの疑問や質問はすべてそこにあります。

回答1:パケットの長さについて:元のパケットには4000バイトが含まれています。このパケットは完全にIPパケットであり、したがって、同様にIPヘッダーを含んでいます。したがって、ペイロードの長さは実際には4000-(IPヘッダーの長さ、つまり20)です。

実際のペイロードの長さ= 4000-20 = 3980

これで、長さがMTU(1500バイト)よりも大きいという事実により、パケットが断片化されます。

したがって、最初のパケットには、IPヘッダーとペイロード部分を含む1500バイトが含まれます。

1500 = 20(IPヘッダー)+ 1480(データペイロード)

他のパケットについても同様です。

3番目のパケットには、残りのデータ(3980-1480 -1480)= 1020が含まれます。

したがって、パケットの長さは20(IPヘッダー)+ 1020(ペイロード)= 1040

回答2:オフセットは、元のデータペイロードを参照してデータが始まるアドレスまたはロケーターです。 IPの場合、データペイロードは、IPヘッダーとオプションヘッダーの後のすべてのデータで構成されます。したがって、システム/ルーターはペイロードを取得し、それをより小さな部分に分割し、元のパケットを参照してオフセットを追跡し、再アセンブリを実行できるようにします。

[〜#〜] rfc [〜#〜] ページ12。

フラグメントオフセットフィールドは、受信者に元のデータグラム内のフラグメントの位置を伝えます。フラグメントオフセットと長さは、このフラグメントがカバーする元のデータグラムの部分を決定します。more-fragmentsフラグは、 (リセットされることにより)最後のフラグメント。これらのフィールドは、データグラムを再構成するのに十分な情報を提供します。 "

フラグメントオフセットは、それぞれ8バイトの単位で測定されます。 IPヘッダーに13ビットのフィールドがあります。 RFCページ17で述べたように

このフィールドは、このフラグメントがデータグラムのどこに属するかを示します。フラグメントオフセットは、8オクテット(64ビット)の単位で測定されます。最初のフラグメントのオフセットはゼロです。

したがって、この8はどこから来たのかという質問で尋ねたように、8オクテットが1つの値として取得されるIPプロトコル仕様に定義されている標準です。これは、これを介して大きなパケットを送信するのにも役立ちます。

RFCの28ページは次のように書いています。*フラグメントは8オクテット単位でカウントされます。断片化戦略は、断片化されていないデータグラムの断片化情報がすべてゼロになるように設計されています(MF = 0、断片オフセット= 0)。インターネットデータグラムが断片化されている場合、そのデータ部分は8オクテットの境界で分割する必要があります。この形式では、合計で65,536オクテットの8つのオクテットの2 ** 13 = 8192フラグメントが許可されます。これは、データグラムの全長フィールドと一致することに注意してください(もちろん、ヘッダーはフラグメントではなく全長でカウントされます)。

17
Ankan Seth

iPヘッダーのオフセットサイズは13ビットですが、最悪の場合のように16ビットが必要です。したがって、8のスケーリング係数(2 ^ 16/2 ^ 13)を使用します。

2
pallavi

これらは余分なビットではなく、最後のフラグメントの全長です。 1500はMTUであるため、ヘッダーを含む1つのフラグメントに1500バイトのデータが存在する可能性があることを意味します。ヘッダーはすべてのフラグメントに追加されます。これは、フラグメント内で1500-20 = 1480バイトのデータを送信できることを意味します。 4000Bのデータグラムがあると仮定します。次に、それぞれ長さ1480、1480、1020の3つの部分(ceil(3980/1480))に断片化されます。したがって、20Bヘッダーが最後のフラグメントに追加されると、その長さは1020 + 20 = 1040になります。

0
codie