
Я использую Ubuntu 14.04 через Virtual Box на хосте Windows 7. Сетевая карта представляет собой адаптер USB-Ethernet.
Theman
для tcpdumpуказывается, что может быть причиной «отбрасывания пакетов ядром», но не указывается, что является причиной «отбрасывания пакетов интерфейсом».
Может ли кто-нибудь пролить свет на то, почему интерфейс может терять пакеты? Или как мне узнать причину потери пакетов?
решение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));
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
В общем, это будет потому, что компьютер слишком занят, чтобы обработать входящий пакет, а интерфейсу некуда его поместить. Драйвер мог не предоставить буферы интерфейсу, прерывание могло быть заблокировано слишком долго, серьезные проблемы с нехваткой ресурсов и т. д.
Сейчас это случается нечасто, поскольку реализация ОС и производительность оборудования улучшились, но в ранние годы это было реальной проблемой, когда (например) дисковод мог перегрузить шину памяти или ОС приходилось выделять интерфейсу буфер в рамках обслуживания прерывания приема (плохая конструкция оборудования).