как отображать идентификатор потока вместе с номером кадра для каждого пакета pcap с помощью tshark/wireshark

Есть ли в tshark понятие идентификатора потока? Когда я искал фильтры, я обнаружил, что tcp.stream существует, но его эквивалента для udp, т.е. udp.stream, не существует. Когда я открываю pcap, по умолчанию он показывает номер кадра, IP-адреса, информацию и т. д. В одном столбце мне также нужен идентификатор потока каждого пакета вместе с номером кадра. Предоставляет ли tshark такую ​​поддержку? Если нет, могу ли я это сделать?

Я написал программу, в которой я читаю файл pcap, пакет за пакетом, и мне нужен идентификатор потока для каждого прочитанного пакета. Если я использую команду tshark как

 ./tshark -r in.pcap -z conv,tcp

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

Любая помощь будет оценена. благодаря.


person mezda    schedule 20.10.2012    source источник
comment
Вы имеете в виду, что вам нужен номер (flowid), связанный с каждой парой ip/port для протокола udp?   -  person graphite    schedule 22.10.2012
comment
@graphite: мне нужен идентификатор потока для каждого пакета в pcap (независимо от того, является ли это upd или tcp). Если это невозможно в tshark, можем ли мы написать какой-нибудь скрипт, используя tshark, с помощью которого мы можем вычислить идентификатор потока для каждого пакета ИЛИ есть ли какая-то стандартная библиотека, в которой есть функция для вычисления идентификатора потока (для назначения нового идентификатора потока или существующего идентификатора потока) с учетом 5 кортеж для потока.   -  person mezda    schedule 22.10.2012


Ответы (1)


tcp.stream в wirehark

Вот что делает wirehrak для получения tcp.stream. Tcp dissector имеет глобальную переменную guint32 tcp_stream_index; Затем каждый пакет связывается с разговором. Данные каждого диалога хранятся в хэш-таблице (Wireshark использует GHashTable). ). В качестве ключа они используют 5-кортеж. Если они получают новый кортеж из 5, они начинают новый диалог и увеличивают там tcp_stream_index:

init_tcp_conversation_data(packet_info *pifo)
{
    ...
    tcpd->stream = tcp_stream_index++;
    ...
}

И вот как они получают хэш:

/*
 * Hash an address into a hash value (which must already have been set).
 */
#define ADD_ADDRESS_TO_HASH(hash_val, addr) { \
    const guint8 *ADD_ADDRESS_TO_HASH_data; \
    int ADD_ADDRESS_TO_HASH_index; \
    ADD_ADDRESS_TO_HASH_data = (addr)->data; \
    for (ADD_ADDRESS_TO_HASH_index = 0; \
         ADD_ADDRESS_TO_HASH_index < (addr)->len; \
         ADD_ADDRESS_TO_HASH_index++) \
         hash_val += ADD_ADDRESS_TO_HASH_data[ADD_ADDRESS_TO_HASH_index]; \
    }

...
hash_val = 0;
ADD_ADDRESS_TO_HASH(hash_val, &key->addr1);
hash_val += key->port1;
ADD_ADDRESS_TO_HASH(hash_val, &key->addr2);
hash_val += key->port2;
...

Добавление идентификатора потока в пакет

Вот простой пример слушателя wireshark, написанного на lua. Но вам нужны функции mk_flowid, update_conversation_data, show_gathered_statics.

local tap 

local conversations = {} 

local function packet(pinfo, tvb, userdata)
    local id = mk_flowid(pinfo.src, pinfo.src_port,
        pinfo.dst, pinfo.dst_port, pinfo.ipproto)

    local conv = converstaion[id]
    update_conversation_data(conv)

    -- Also you can output to a file
    -- to_file(pinfo.number, id)
end

local function draw(userdata)
    print_gathered_statistics(conversations)
end

local function reset(userdata)
    conversations = {}
end

local function show_myconv()
     tap = Listener.new()
     tap.packet = packet
     tap.draw = draw 
     tap.reset = reset 
end

register_stat_cmd_arg('myconv', show_myconv)

И Ланч Тшарк:

tshark -X lua_script:myconv.lua -z myconv -r in.pcap
person graphite    schedule 23.10.2012
comment
я не могу понять, что вы пытаетесь сказать здесь ... мне просто нужна одна fn для вычисления идентификатора потока ... пожалуйста, дайте мне знать, есть ли какая-то стандартная библиотечная функция, предназначенная для этой цели. - person mezda; 25.10.2012
comment
мне просто нужен идентификатор потока udp (аналогичный тому, который предоставляется tcp.stream для потоков tcp) для пакетов udp. плз подскажите как это сделать? Благодарность - person mezda; 26.10.2012
comment
@ user1182722, я описал, как wireshark делает это для tcp, надеюсь, это поможет. - person graphite; 26.10.2012