
262144
tcpdump がデフォルトのスナップショットの長さとしてマジックナンバーを持っている理由が知りたいです。
--snapshot-length=snaplen デフォルトの 262144 バイトではなく、各パケットから snaplen バイトのデータをスナッフします。スナップショットが制限されているため切り捨てられたパケットは、出力に ``[|proto]'' で示されます。ここで、proto は切り捨てが発生したプロトコル レベルの名前です。スナップショットを大きくすると、パケットの処理にかかる時間が増加し、パケット バッファリングの量が実質的に減少することに注意してください。これにより、パケットが失われる可能性があります。また、スナップショットを小さくすると、トランスポート層より上のプロトコルからのデータが破棄され、重要な情報が失われる可能性があることにも注意してください。たとえば、NFS および AFS の要求と応答は非常に大きいため、スナップショットの長さが短すぎると、詳細のほとんどが利用できなくなります。スナップショットのサイズをデフォルトより小さくする必要がある場合は、必要なプロトコル情報をキャプチャできる最小の数値に snaplen を制限する必要があります。snaplen を 0 に設定すると、tcpdump の最近の古いバージョンとの下位互換性のために、デフォルトの 262144 に設定されます。
参照:マニュアルページ
答え1
tcpdump は、tcpdump.js で定義されています。
/*
* Maximum snapshot length. This should be enough to capture the full
* packet on most network interfaces.
*
*
* Somewhat arbitrary, but chosen to be:
*
* 1) big enough for maximum-size Linux loopback packets (65549)
* and some USB packets captured with USBPcap:
*
* http://desowin.org/usbpcap/
*
* (> 131072, < 262144)
*
* and
*
* 2) small enough not to cause attempts to allocate huge amounts of
* memory; some applications might use the snapshot length in a
* savefile header to control the size of the buffer they allocate,
* so a size of, say, 2^31-1 might not work well.
*
* XXX - does it need to be bigger still?
*/
#define MAXIMUM_SNAPLEN 262144
それほど大きなものではありません。Linux ループバックはハードウェア フレームに制限されないため、最大サイズは 64k とかなり大きくなります。他のパケットはさらに大きくなる可能性があるため、2 の累乗で 256k になります。