MTUは、リンク層に渡すことができ、最大ペイロードサイズです。リンク層ヘッダーは含まれていません。たとえば、イーサネット上では1514または1518ではなく1500になり、フルサイズのイーサネットパケットをキャプチャするのに十分な大きさではありません。
はまた、そのような802.11無線情報のradiotapヘッダとして任意のメタデータ・ヘッダが含まれていません。
アダプタが断片化/セグメンテーション/リアセンブリオフロードのいずれかの形式を実行している場合、アダプタに渡されたパケットまたはアダプタから受信されたパケットは、まだ断片化またはセグメント化されていないか、または再アセンブリされている可能性があります。 多くは MTUより大きいかもしれません。
固定サイズのパケットスロットを持つ、LinuxのメモリマップされたTPACKET_V1およびTPACKET_V2キャプチャメカニズムにのみ適用されるPCAPバッファ内のより多くのパケットをフィッティングする場合。他のキャプチャメカニズムではすべてのパケットに最大サイズのスロットが予約されないため、スナップショットの長さを短くすることは重要ではありません。 TPACKET_V1とTPACKET_V2では、スナップショットの長さを短くすることで違いがありますが、少なくともEthernetの場合、libpcap 1.2.1はイーサネットに適したバッファスロットサイズを選択することができます。 (TPACKET_V3は固定サイズのパケット単位のスロットを持っていないようですが、この場合はこの問題はありませんが、正式にリリースされたカーネルにしか現れず、libpcapにまだサポートされていません)。
大丈夫、私は私が監視するつもりトラフィックに対して予想最大サイズを「推測」しなければなりません。 – ziu
*現代版のlibpcapでLinuxを使用していて、バージョンが1.2.1以降でない場合、またはイーサネットでキャプチャしていない場合(またはフラグメンテーション/セグメンテーション/リアセンブリオフロードでイーサネットでキャプチャしている場合) 、*と*あなたは巨大な共有メモリバッファ( 'pcap_create()'/'pcap_set_buffer_size()'/'pcap_activate()')を割り当てたくないので、パケットが落ちないようにするには、 libpcapに配送されるパケットの最大サイズを推測してください。 –
私は新しいパケットを取得する前に各パケットを分析しないので、私の問題は二重です。したがって、ユーザーアプリケーションレベルでもバッファリングする必要があります。だからこそ私はメモリ使用量を調整しようとしています。 – ziu