tcpdump의 기본 캡처 크기가 262144인 이유는 무엇입니까?

tcpdump의 기본 캡처 크기가 262144인 이유는 무엇입니까?

262144tcpdump에 기본 스냅샷 길이로 매직 넘버가 있는 이유가 궁금합니다 .

--snapshot-length=snaplen Snarf snaplen은 기본값인 262144바이트가 아닌 각 패킷의 데이터 바이트입니다. 제한된 스냅샷으로 인해 잘린 패킷은 ``[|proto]''로 출력에 표시됩니다. 여기서 proto는 잘림이 발생한 프로토콜 수준의 이름입니다. 더 큰 스냅샷을 찍으면 패킷을 처리하는 데 걸리는 시간이 늘어나고, 사실상 패킷 버퍼링 양이 줄어듭니다. 이로 인해 패킷이 손실될 수 있습니다. 또한 더 작은 스냅샷을 찍으면 전송 계층 위의 프로토콜에서 데이터가 삭제되어 중요한 정보가 손실될 수 있습니다. 예를 들어, NFS 및 AFS 요청 및 응답은 매우 크므로 너무 짧은 스냅샷 길이를 선택하면 세부 정보의 대부분을 사용할 수 없습니다. 스냅샷 크기를 기본값 이하로 줄여야 하는 경우, 관심 있는 프로토콜 정보를 캡처할 수 있는 가장 작은 숫자로 snaplen을 제한해야 합니다. snaplen을 0으로 설정하면 최근 이전 버전과의 하위 호환성을 위해 기본값인 262144로 설정됩니다. tcpdump 버전.

참조:매뉴얼 페이지

답변1

https://github.com/the-tcpdump-group/tcpdump/blob/tcpdump-4.9/netdissect.h

/*
 * 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까지 몇 제곱이 됩니다.

관련 정보