Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во пакетов и байт для каждой записи? а то там очень большие значения в полях dPkts и dOctets?
>Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во
>пакетов и байт для каждой записи? а то там очень большие
>значения в полях dPkts и dOctets?
http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...
>>Здравствуйте.Не подскажите получаю udp-дейтаграмму по Netflow,разбираю ее на записи,а как подсчитать кол-во
>>пакетов и байт для каждой записи? а то там очень большие
>>значения в полях dPkts и dOctets?
>
>
>http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...Что означают поля dPkts и dOctets?кол-во пакетов и байтов в потоке flow? как подсчитать кол-во пакетов и байт для каждой записи? или я что-то не понимаю
dPkts - кол-во пакетов, dOctets - кол-во октетов.
Вы сами флов разбираете или чем-то? Какой тулой?
>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>Вы сами флов разбираете или чем-то? Какой тулой?да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets 2585853952.
На чем пишите? Покажите структуру датаграммы...
>На чем пишите? Покажите структуру датаграммы...Пишу в 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;
>>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>>Вы сами флов разбираете или чем-то? Какой тулой?
>
>да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих
>полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets
>2585853952.В одном пакете (принятого с циски) может быть несколько flows
первые 24 байта пакета содержат заголовок,
в котором в поле v5header.count написано, сколько flows пришло в этом пакете (как я подозреваю, минимум 1)далее считываешь блоками по 48 байт конкретные flow'ы
ну и получаешь что-то типа
v5Flow[index].dOctets
>>>dPkts - кол-во пакетов, dOctets - кол-во октетов.
>>>Вы сами флов разбираете или чем-то? Какой тулой?
>>
>>да сам,самописная программка только начал писать.Вот и спрашиваю,дело в том,что в этих
>>полях у меня получаются значения типа кол-во пакетов 385875968 кол-во dOctets
>>2585853952.
>
>В одном пакете (принятого с циски) может быть несколько flows
>
>первые 24 байта пакета содержат заголовок,
>в котором в поле v5header.count написано, сколько flows пришло в этом пакете
>(как я подозреваю, минимум 1)
>
>далее считываешь блоками по 48 байт конкретные flow'ы
>ну и получаешь что-то типа
>v5Flow[index].dOctetsтак я и говорю после того как считали получаем в поле v5Flow[index].dOctets значение порядка 2585853952.
>так я и говорю после того как считали получаем в поле v5Flow[index].dOctets
>значение порядка 2585853952.
проверь для начала, что в самом пакете содержимое не такое же.
варинты - flow-tools, ethereal.
во-вторых, longword в дельфи это signed или unsigned?
>>так я и говорю после того как считали получаем в поле v5Flow[index].dOctets
>>значение порядка 2585853952.
>проверь для начала, что в самом пакете содержимое не такое же.
>варинты - flow-tools, ethereal.
>во-вторых, longword в дельфи это signed или unsigned?
longword это unsigned.
>>>так я и говорю после того как считали получаем в поле 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.
2nikl
Это все unsigned. Действительно, лучше начать с Ethereal.
Обратите внимание:
2585853952 переводим в bin и получаем 10000100010110010000000000000000
теперь записываем это дело наоборот и переводим в dec
1001101000100001 получаем 39457. Так похоже на правду? :)
Точнее, наверно будет 01011001 10000100 - 22916
>Обратите внимание:
>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>теперь записываем это дело наоборот и переводим в dec
>1001101000100001 получаем 39457. Так похоже на правду? :)тогда
для londword надо делать преобразования ntohl()
для shortword соответственно ntohs()обе функции есть в winsock.pas
>>Обратите внимание:
>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>теперь записываем это дело наоборот и переводим в dec
>>1001101000100001 получаем 39457. Так похоже на правду? :)
>
>тогда
>для londword надо делать преобразования ntohl()
>для shortword соответственно ntohs()
>
>обе функции есть в winsock.pasя делаю только функцией swap.
>>>Обратите внимание:
>>>2585853952 переводим в bin и получаем 10000100010110010000000000000000
>>>теперь записываем это дело наоборот и переводим в dec
>>>1001101000100001 получаем 39457. Так похоже на правду? :)
>>
>>тогда
>>для londword надо делать преобразования ntohl()
>>для shortword соответственно ntohs()
>>
>>обе функции есть в winsock.pas
>
>я делаю только функцией swap.ваши проблемы =)
>>>Обратите внимание:
>>>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.
>>>>Обратите внимание:
>>>>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.
Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся с этой проблеммой, не могу побороть. Помогайте !!!
>Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся
>с этой проблеммой, не могу побороть. Помогайте !!!
функция ntohl()
>>Люди !!! Ну кто-то смог из октетов получить байты ? Тоже столкнулся
>>с этой проблеммой, не могу побороть. Помогайте !!!
>функция ntohl()
Пробывал.dpkts 43974
doctets 2286656Реально передано данных : 456 Mb.
htohl(2286656) = 1088692736
htohl(43974) = -961871872И все опять тупик. Что с этим дальше то делать ? Дайте кто нить исходник. Вообщеть надо чтобы PHP мог из dpkts, doctets считать байты.
Здравствуйте! Подскажить, что есть собственно протокол NetFlow, может есть где почитать именно про его суть(желательно на русском)?Где-нибудь встречалость ли разложение по вейвлетом трафика,(надо собрать статистику по самым посещаемым хостам, например,при этом отделяя маленькие потоки трафика, для этого трафик и раскладывается по вейвлетам) если имеем маршрутизатор Cisco, ана нём NetFlow.Это моя курсовая робота, я студентка, и пока мало что в этой теме понимаю.Помогите:)
Протокол Netflow описан тут:
http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/...
http://www.cisco.com/en/US/products/ps6601/products_ios_prot...
Если в двух словах то ключевое понятие в Netflow это поток: набор пакетов с одинаковых proto /src-ip / dst-ip / src-port / dst-port (если есть).Соответвенно один пакето нетфлоу содержить эту (и дополнительную и информацию) а так же число таких пакетов и общий их объем.
Пакет с информацией по потоку послыается в случае истечение таймаута (для неактивных сессий он небольшой, для активных больше) или в случае закрытия TCP-сесси (обмена FYN, FYN+ACK).