IPヘッダーに「フラグメント化しない」フラグがあります。アプリケーションはこのフラグを設定できますか?このフラグを設定するタイミングとその理由は?
「DF」ビットがパケットに設定されている場合、通常はMTUより大きいパケットをフラグメント化する(そして潜在的に順序が狂って配信する)ルーターは、代わりにパケットをドロップします。ルータは「ICMPFragmentationNeeded」パケットを送信することが期待されており、送信側ホストが宛先ホストへのパスの下位MTUを考慮できるようにします。次に、送信側は接続のパスMTU(最大伝送ユニット)の見積もりを減らし、より小さなセグメントで再送信します。このプロセスはPMTU-D(「パスMTUディスカバリー」)と呼ばれます。
断片化により、CPU処理に余分なオーバーヘッドが発生し、もう一方の端でパケットが再構築されます(および欠落しているフラグメントが処理されます)。
通常、「DF」ビットはIPスタックの構成可能なパラメーターです。 DFを設定するオプションを備えたpingユーティリティを知っています。
断片化と再アセンブリのためのCPU使用率は別として、スループットに影響を与える可能性があるため、断片化を回避すると便利なことがよくあります(失われたフラグメントが再送信を必要とする場合)。このため、最大伝送ユニットを知っていることが望ましい場合がよくあります。したがって、「パスMTUディスカバリー」は、DFビット(pingの場合など)を設定するだけで、このサイズを見つけるために使用されます。
このフラグを設定する可能性がある場所について私が考えることができる唯一の状況は次のとおりです。
そのような特定の状況を除いて、あなたはおそらくそれに触れることはないでしょう。
RFC 791から:
インターネットデータグラムの断片化は、大きなパケットサイズを許可するローカルネットで発信され、宛先に到達するためにパケットを小さなサイズに制限するローカルネットを通過する必要がある場合に必要です。
インターネットデータグラムには、「断片化しない」というマークを付けることができます。そのようにマークされたインターネットデータグラムは、いかなる状況においてもインターネットで断片化されるべきではありません。フラグメント化しないとマークされたインターネットデータグラムがフラグメント化せずに宛先に配信できない場合は、代わりに破棄されます。
アプリケーションはこのフラグを設定できますか?はい、IPヘッダーを処理するのに十分な低レベルのコードを記述している場合は可能です。質問のこの部分は、より具体的な答えを与えるために少し広いです。方法を心配する前に、それを設定したいかどうかをおそらく理解する必要があります。
RFC 791のさらに下には、次のように書かれています。
If the Don't Fragment flag (DF) bit is set, then internet fragmentation of this datagram is NOT permitted, although it may be discarded. This can be used to prohibit fragmentation in cases where the receiving Host does not have sufficient resources to reassemble internet fragments.
したがって、彼らが当初考えていたのは、IPの実装が可能な限り単純で、メモリが少ない小さな組み込みデバイスだったようです。今日、あなたはスマート電球や煙探知器のようなIoTデバイスを考えるかもしれません。フラグメントを再構築するためのコードやメモリがない可能性があるため、それらと通信するソフトウェアはDFを設定します。