Почему tcpdump пакеты отбрасывают интерфейсом?

Прежде всего нет никакого глобального значения по умолчанию, полномочия зависят от приложения, которое создает файл. Например, эта небольшая программа C создаст файл '/tmp/foo' с полномочиями 0777, если umask будет 0000 (в любом случае, то полномочия будут 0777 и ~umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Однако много приложений создают файлы с полномочиями 0666. Это имеет две причины:

  1. Безопасность: Вы не хотите, чтобы любой произвольный файл был исполняемым файлом.
  2. Удобство: большинство файлов не должно быть исполняемым файлом. Легче установить исполняемый файл, обдумал выбор немного файлов, чем сбросить его на огромной сумме других файлов. Конечно, umask 0133 решил бы это, но затем ничто не выиграно, и Вы не могли позволить программам создать исполняемые файлы, даже если бы Вы хотели.
3
17.08.2017, 10:52
2 ответа

Обычно это происходит потому, что компьютер слишком занят для обработки входящего пакета, а интерфейс некуда поставить. Возможно, драйвер не предоставил буферы интерфейсу, прерывание может быть заблокировано слишком долго, серьезные проблемы с ресурсами, подобные этой.

Этого больше не происходит, поскольку реализация ОС и производительность оборудования улучшились, но в первые дни это было реальной проблемой, когда (например) дисковый накопитель мог перегружать шину памяти или ОС приходилось предоставить интерфейсу буфер как часть обслуживания прерывания приема (плохая конструкция оборудования).

0
27.01.2020, 21:23

Как вы указали, в документации нет ничего о счетчике "пакеты, отброшенные интерфейсом". Итак, нам нужно немного покопаться в исходном коде.

Из исходного кода 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));

Из man pcap _статистика:

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/*
8
27.01.2020, 21:23

Теги

Похожие вопросы