Для решения задачи учета траффика возможно несколько путей. В любом случае нам надо этот траффик откуда-то снять. В принципе, эта задача не представляет собой большой сложности и может быть решена различными путями. Далее с содержимым заголовков пакетов необходимо произвести действия по выделению полезной информации и ее дальнейшей записи в систему сбора статистики. Хотелось бы более подробно обсудить со знающими людьми ряд тонких моментов. Для более конкретного разговора будем считать, что целевая платформа - линукс, хотя я с удовольствием прочитаю и про другие платформы.1. Съем траффика
Я создал пакетный сокет, который прикручиваю к обрабатываемому интерфейсу. Сокет перехватывает весь пакет, начиная с заголовка ethernet. Для этого я использовал вызов recv_from, и это прекрасно работает, НО! Вызов не завершается, пока не будет перехвачен хоть один пакет. А мне хотелось бы иметь примерно такую структуру для этой части программы:
flag = 1;
while( flag )
{
if( проверить_есть_ли_данные_в сокете() )
{
считать_данные_из_сокета();
}
if( пора_сбросить_данные() )
{
сбросить_данные();
}
if( пора_завершить_работу() )
{
flag = 0;
}
}
для реализации подобной схемы мне надо как-то узнать, есть ли данные в сокете, причем сделать это таким образом, чтобы функция не ждала эти данные вечность. Я почитал маны и нарыл, что похоже мне смогут помочь
функции select или poll. Вопросы: это единственный вариант или есть еще какие-либо возможности? Правильно ли я вообще понял возможность использования в данном случае этих функций? И какая из функций лучше - select или poll? Какие подводные камни есть в использовании этих функций?
2. Логирование траффика
В принципе можно писать в лог информацию по каждому пакету, либо каким-либо образом группировать информацию, а потом сбрасывать в лог уже получившуюся выжимку. У каждого варианта есть свои плюсы и минусы, но мне лично больше нравится второй вариант. Хотелось бы узнать, как это делается в других программах учета траффика, и как это делается в железках.
3. Разделение траффика на свой и чужой.
По какому принципу системы учета траффика делят пакеты? Если провайдер присылает мне счет за 1Гиг, то что входит в этот гиг - только данные пакетов или и их заголовки? И если входят заголовки, то до какого уровня.
Я решил, что не должны учитываться заголовки канального уровня, но должны сетевого - насколько это правильно?
---------------------------------------------------------------
ethhdr | ip header | data |
---------------------------------------------------------------
^ ^
| |
| ------ платит клиент
------------ Плачу я
Заранее спасибо за ваши ответы.