tcpdump 패킷이 인터페이스에 의해 삭제되는 이유는 무엇입니까?

tcpdump 패킷이 인터페이스에 의해 삭제되는 이유는 무엇입니까?

Windows 7 호스트에서 Virtual Box를 통해 Ubuntu 14.04를 사용하고 있습니다. NIC는 USB-이더넷 어댑터입니다.

그만큼mantcpdump의 경우"커널에 의해 삭제된 패킷"의 원인은 설명하지만 "인터페이스에 의해 삭제된 패킷"의 원인은 명시하지 않습니다.

인터페이스가 패킷을 삭제하는 이유에 대해 누군가가 밝힐 수 있습니까? 아니면 패킷이 삭제되는 이유를 어떻게 알 수 있나요?

답변1

지적했듯이 "인터페이스에 의해 삭제된 패킷" 카운터에 대한 문서에는 아무것도 없습니다. 따라서 소스 코드 파기가 필요합니다.

로부터tcpdump의 소스 코드, 인터페이스 드롭 카운터는 다음에서 추출됩니다 stats.ps_ifdrop.

if (stats.ps_ifdrop != 0) {
    if (!verbose)
        fputs(", ", stderr);
    else
        putc('\n', stderr);
    (void)fprintf(stderr, "%u packet%s dropped by interface\n",
        stats.ps_ifdrop, PLURAL_SUFFIX(stats.ps_ifdrop));

에서남자 pcap_stats:

ps_ifdrop
    number of packets dropped by the network interface or its driver.

그리고libpcap 소스 코드:

 *  "ps_ifdrop" is supported. It will return the number
 *  of drops the interface reports in /proc/net/dev,
 *  if that is available.

그래서tcpdump "인터페이스에 의해 삭제된 패킷" 카운터는 캡처 /proc/net/dev중에 삭제된 것으로 기록된 패킷에 해당합니다.tcpdump.

필드 의 의미가 /proc/dev/net설명됩니다.여기

하락을 더 잘 이해하기 위해 다음 통계를 살펴보는 것부터 시작하겠습니다.

  • ethtool -S <interface>
  • grep '' /sys/class/net/<interface>/statistics/*

답변2

일반적으로 이는 컴퓨터가 너무 바빠서 들어오는 패킷을 처리할 수 없고 인터페이스에 패킷을 넣을 장소가 없기 때문입니다. 드라이버가 인터페이스에 버퍼를 제공하지 않았을 수 있으며, 인터럽트가 너무 오랫동안 차단될 수 있으며 이와 같은 심각한 리소스 부족 문제가 발생할 수 있습니다.

OS 구현과 하드웨어 성능이 향상되면서 이런 일이 더 이상 발생하지 않지만, 예를 들어 디스크 드라이브가 메모리 버스를 많이 사용하거나 OS가 인터페이스를 제공해야 했던 초기에는 실제 문제였습니다. 수신 인터럽트 서비스의 일부로 버퍼 사용(하드웨어 설계 불량).

관련 정보