ソケット バッファを使用する必要がある Linux カーネルで新しいネット デバイスを作成しています。
head
ソケット バッファの構造を調べると、、、、という 4 つのフィールドが表示さdata
れtail
ますend
。ソケット バッファのヘッド ルームとテール ルームの目的は何ですか。
ソケット バッファを使用する必要がある Linux カーネルで新しいネット デバイスを作成しています。
head
ソケット バッファの構造を調べると、、、、という 4 つのフィールドが表示さdata
れtail
ますend
。ソケット バッファのヘッド ルームとテール ルームの目的は何ですか。
ソケット バッファ (別名 skbuff) は、カーネル全体のネットワーク層に沿って渡されます。つまり、それらはトランスポート層からネットワーク層などに渡されます。これの主な理由はパフォーマンスであり、カーネルがバッファーを通過するたびにコピーして再作成する必要がなくなります。
これは、skbuff データが異なる層を通過する際に、対応するプロトコル ヘッダー データで満たされることを意味します。たとえば、トランスポート層では TCP ヘッダーを取得し、ネットワーク層では IP ヘッダーなどを取得します。
最適化として、Linux カーネルはこれらのヘッダーにスペースを事前に割り当てます。これは、実際には が指す skbuff 内のバッファーhead
です。ここで、データが開始する場所、つまり現在構築されているパケットの最初のバイトが で示されdata
ます。同様に、現在構築されているパケットの最後と、事前に割り当てられたバッファーのtail
最後を指します。end
この画像は私の言葉を理解するのに役立つかもしれません: http://www.kernelchina.org/files/image_thumb_3_4.png
現在、実際にメモリを再割り当てしてバイトをコピーするよりも、これらのポインターを移動してカーネルが送受信しようとしているパケットを (再) 構築する方が、計算量がはるかに少なくなります。