URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID6
Нить номер: 9481
[ Назад ]

Исходное сообщение
"протокол Netflow"

Отправлено ZDenis , 23-Дек-05 09:30 
Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во пакетов и байт для каждой записи? а то там очень большие значения в полях dPkts и dOctets?

Содержание

Сообщения в этом обсуждении
"протокол Netflow"
Отправлено nikl , 23-Дек-05 09:37 
>Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во
>пакетов и байт для каждой записи? а то там очень большие
>значения в полях dPkts и dOctets?


http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...


"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 10:12 
>>Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во
>>пакетов и байт для каждой записи? а то там очень большие
>>значения в полях dPkts и dOctets?
>
>
>http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...

Что означают поля dPkts и dOctets?кол-во пакетов и байтов в потоке flow?  как подсчитать кол-во пакетов и байт для каждой записи? или я что-то не понимаю


"протокол Netflow"
Отправлено sh_ , 23-Дек-05 10:39 
dPkts - кол-во пакетов, dOctets - кол-во октетов.
Вы сами флов разбираете или чем-то? Какой тулой?

"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 10:48 
>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>Вы сами флов разбираете или чем-то? Какой тулой?

да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets 2585853952.


"протокол Netflow"
Отправлено sh_ , 23-Дек-05 11:13 
На чем пишите? Покажите структуру датаграммы...

"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 11:15 
>На чем пишите? Покажите структуру датаграммы...

Пишу в Delphi.
описание датаграммы
type
  Tflowheader=packed record
   version:word;
   count:word;
   sysuptime:LongWord;
   unix_secs:LongWord;
   unix_nsecs:LongWord;
   flow_sequence:LongWord;
   engine_type:byte;
   engine_id:byte;
   sampling_interval:word;
end;
type
  Pflowrecords = ^Tflowrecords;
  Tflowrecord=packed record
   srcaddr:LongWord;
   dstaddr:longword;
   nexhop:LongWord;
   input:word;
   output:word;
   dPkts:longword;
   dOctets:longword;
   First:longword;
   Last:longword;
   srcport:word;
   dstport:word;
   pad1:byte;
   tcp_flags:byte;
   prot:byte;
   tos:byte;
   src_as:word;
   dst_as:word;
   src_mask:byte;
   dst_mask:byte;
   pad2:word;
  end;


"протокол Netflow"
Отправлено nikl , 23-Дек-05 11:16 
>>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>>Вы сами флов разбираете или чем-то? Какой тулой?
>
>да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих
>полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets
>2585853952.

В одном пакете (принятого с циски) может быть несколько flows

первые 24 байта пакета содержат заголовок,
в котором в поле v5header.count написано, сколько flows пришло в этом пакете (как я подозреваю, минимум 1)

далее считываешь блоками по 48 байт конкретные flow'ы
ну и получаешь что-то типа
v5Flow[index].dOctets



"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 11:25 
>>>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>>>Вы сами флов разбираете или чем-то? Какой тулой?
>>
>>да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих
>>полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets
>>2585853952.
>
>В одном пакете (принятого с циски) может быть несколько flows
>
>первые 24 байта пакета содержат заголовок,
>в котором в поле v5header.count написано, сколько flows пришло в этом пакете
>(как я подозреваю, минимум 1)
>
>далее считываешь блоками по 48 байт конкретные flow'ы
>ну и получаешь что-то типа
>v5Flow[index].dOctets

так я и говорю после того как считали получаем в поле v5Flow[index].dOctets значение порядка 2585853952.


"протокол Netflow"
Отправлено nikl , 23-Дек-05 11:37 
>так я и говорю после того как считали получаем в поле v5Flow[index].dOctets
>значение порядка 2585853952.
проверь для начала, что в самом пакете содержимое не такое же.
варинты - flow-tools, ethereal.
во-вторых, longword в дельфи это signed или unsigned?



"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 11:57 
>>так я и говорю после того как считали получаем в поле v5Flow[index].dOctets
>>значение порядка 2585853952.
>проверь для начала, что в самом пакете содержимое не такое же.
>варинты - flow-tools, ethereal.
>во-вторых, longword в дельфи это signed или unsigned?


longword это unsigned.


"протокол Netflow"
Отправлено Simps , 23-Дек-05 12:14 
>>>так я и говорю после того как считали получаем в поле v5Flow[index].dOctets
>>>значение порядка 2585853952.
>>проверь для начала, что в самом пакете содержимое не такое же.
>>варинты - flow-tools, ethereal.
>>во-вторых, longword в дельфи это signed или unsigned?
>
>
>longword это unsigned.

В свое время начинал как то писать ...

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, StdCtrls,
  Sockets, NMUDP, ExtCtrls,Winsock,math, ComCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    NMUDP1: TNMUDP;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Memo2: TMemo;
    Label3: TLabel;
    Label4: TLabel;
    StatusBar1: TStatusBar;
    procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
TFlowheader = record
netflow_version_number : word;
number_flows_exported_packet : word;
sysUptime : integer;
unix_secs : integer;
double
res_unix_secs : integer;
flow_sequence : integer;
engine_type : byte;
engine_id : byte;
sampling_interval : word;
end;

TFlowdata = record
srcaddr : in_addr;
dstaddr : in_addr;
nexhop : integer;
input : word;
output : word;
dPkts : integer;
dOctets : integer;
First : integer;
Last : integer;
srcport : word;
dstport : word;
pad1 : byte;
tcp_flags : byte;
prot : byte;
tos : byte;
src_as : word;
dst_as : word;
src_mask : byte;
dst_mask : byte;
pad2 : word;
end;

var
  Form1: TForm1;
  globtrcisco  : DWORD;
  globtr,globtrr : double;
  lasceq : dword;
  secerr,flowerr : integer;

implementation

{$R *.dfm}

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var
  header : TFlowheader;
  flowdata : TFlowdata;
  MyStream: TMemoryStream;
  check,i : integer;
begin
globtrcisco:=globtrcisco+NumberBytes;
Label2.Caption:=IntToStr(globtrcisco)+' byte';
MyStream := TMemoryStream.Create;
try
    NMUDP1.ReadStream(MyStream);
    MyStream.Read(header, sizeof(header));
    check:=NumberBytes-sizeof(header)-ntohs(header.number_flows_exported_packet)*48;
    if check<>0 then
    begin
    inc(flowerr,1);
    StatusBar1.Panels[1].Text:='CRCERR: '+IntToStr(flowerr);
    end else
    begin
    for i := 1 to ntohs(header.number_flows_exported_packet) do
    begin
    MyStream.Read(flowdata, sizeof(flowdata));
    globtr:=globtr+ntohl(flowdata.dOctets);
    globtrr:=roundto(globtr/1024/1024,-3);
//    Memo2.Lines.Add(inet_ntoa(flowdata.srcaddr)+':'+IntToStr(ntohs(flowdata.srcport))+'-->'+inet_ntoa(flowdata.dstaddr)+':'+IntToStr(ntohs(flowdata.dstport))+', number of bytes '+IntToStr(ntohl(flowdata.dOctets))+', packets '+IntToStr(ntohl(flowdata.dPkts)))
    end;
    Label4.Caption:=FloatToStr(globtrr)+' Mb';
    if htonl(header.flow_sequence)<>lasceq+ntohs(header.number_flows_exported_packet) then
            begin
                    inc(secerr,1);
                    StatusBar1.Panels[0].Text:='SECERR: '+IntToStr(secerr);
            end;
    lasceq:=ntohl(header.flow_sequence);
//    Memo1.Lines.Add('Size of packet - '+inttostr(NumberBytes)+',Version is - '+inttostr(ntohs(header.netflow_version_number))+', count of records - '+IntToStr(ntohs(header.number_flows_exported_packet))+', flow sequence - '+IntToStr(ntohl(header.flow_sequence)));
    end;
  finally
    MyStream.Free;
  end;
end;

end.


"протокол Netflow"
Отправлено sh_ , 23-Дек-05 12:00 
2nikl
Это все unsigned. Действительно, лучше начать с Ethereal.

"протокол Netflow"
Отправлено sh_ , 23-Дек-05 12:05 
Обратите внимание:
2585853952 переводим в bin и получаем 10000100010110010000000000000000
теперь записываем это дело наоборот и переводим в dec
1001101000100001 получаем 39457. Так похоже на правду? :)

"протокол Netflow"
Отправлено sh_ , 23-Дек-05 12:08 
Точнее, наверно будет 01011001 10000100 - 22916

"протокол Netflow"
Отправлено nikl , 23-Дек-05 12:16 
>Обратите внимание:
>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>теперь записываем это дело наоборот и переводим в dec
>1001101000100001 получаем 39457. Так похоже на правду? :)

тогда
для londword надо делать преобразования ntohl()
для shortword соответственно ntohs()

обе функции есть в winsock.pas


"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 12:19 
>>Обратите внимание:
>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>теперь записываем это дело наоборот и переводим в dec
>>1001101000100001 получаем 39457. Так похоже на правду? :)
>
>тогда
>для londword надо делать преобразования ntohl()
>для shortword соответственно ntohs()
>
>обе функции есть в winsock.pas

я делаю только функцией swap.


"протокол Netflow"
Отправлено nikl , 23-Дек-05 12:46 
>>>Обратите внимание:
>>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>>теперь записываем это дело наоборот и переводим в dec
>>>1001101000100001 получаем 39457. Так похоже на правду? :)
>>
>>тогда
>>для londword надо делать преобразования ntohl()
>>для shortword соответственно ntohs()
>>
>>обе функции есть в winsock.pas
>
>я делаю только функцией swap.

ваши проблемы =)


"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 12:49 
>>>Обратите внимание:
>>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>>теперь записываем это дело наоборот и переводим в dec
>>>1001101000100001 получаем 39457. Так похоже на правду? :)
>>
>>тогда
>>для londword надо делать преобразования ntohl()
>>для shortword соответственно ntohs()
>>
>>обе функции есть в winsock.pas
>
>я делаю только функцией swap.

а в чем прблемы?
Delphi syntax:

function Swap(X);

Description

In Delphi code, Swap exchanges the high-order bytes with the low-order bytes of the argument. X is an expression of type SmallInt, as a 16-bit value, or Word. This is provided for backward compatibility only.


"протокол Netflow"
Отправлено ZDenis , 23-Дек-05 13:21 
>>>>Обратите внимание:
>>>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>>>теперь записываем это дело наоборот и переводим в dec
>>>>1001101000100001 получаем 39457. Так похоже на правду? :)
>>>
>>>тогда
>>>для londword надо делать преобразования ntohl()
>>>для shortword соответственно ntohs()
>>>
>>>обе функции есть в winsock.pas
>>
>>я делаю только функцией swap.
>
>а в чем прблемы?


Да действительно дело было в функции swap!!!хотя двухбайтные типы преобразовывает нормально.
>Delphi syntax:
>
>function Swap(X);
>
>Description
>
>In Delphi code, Swap exchanges the high-order bytes with the low-order bytes
>of the argument. X is an expression of type SmallInt, as
>a 16-bit value, or Word. This is provided for backward compatibility
>only.



"протокол Netflow"
Отправлено xoxa , 02-Мрт-07 08:29 
Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся с этой проблеммой, не могу побороть. Помогайте !!!

"протокол Netflow"
Отправлено ZDenis , 02-Мрт-07 09:04 
>Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся
>с этой проблеммой, не могу побороть. Помогайте !!!
функция ntohl()

"протокол Netflow"
Отправлено xoxa , 02-Мрт-07 09:13 
>>Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся
>>с этой проблеммой, не могу побороть. Помогайте !!!
>функция ntohl()


Пробывал.

dpkts      43974
doctets    2286656

Реально передано данных : 456 Mb.

htohl(2286656) = 1088692736
htohl(43974)   = -961871872

И все опять тупик. Что с этим дальше то делать ? Дайте кто нить исходник. Вообщеть надо чтобы PHP мог из dpkts, doctets считать байты.


"протокол Netflow"
Отправлено Alise , 06-Мрт-07 21:35 
Здравствуйте! Подскажить, что есть собственно протокол NetFlow, может есть где почитать именно про его суть(желательно на русском)?Где-нибудь встречалость ли  разложение по вейвлетом трафика,(надо собрать статистику по самым посещаемым хостам, например,при этом отделяя маленькие потоки трафика, для этого  трафик и раскладывается по вейвлетам) если имеем маршрутизатор Cisco, ана нём NetFlow.Это моя курсовая робота, я студентка, и пока мало что в этой теме понимаю.Помогите:)

"протокол Netflow"
Отправлено citrin , 06-Мрт-07 22:03 
Протокол Netflow описан тут:
http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...
http://www.cisco.com/en/US/products/ps6601/products_ios_prot...

"протокол Netflow"
Отправлено citrin , 06-Мрт-07 22:08 
Если в двух словах то ключевое понятие в Netflow это поток: набор пакетов с одинаковых proto /src-ip / dst-ip / src-port / dst-port (если есть).

Соответвенно один пакето нетфлоу содержить эту (и дополнительную и информацию) а так же число таких пакетов и общий их объем.

Пакет с информацией по потоку послыается в случае истечение таймаута (для неактивных сессий он небольшой, для активных больше) или в случае закрытия TCP-сесси (обмена FYN, FYN+ACK).