【问题标题】:how to display flowid alongwith frame number for each packet of a pcap using tshark/wireshark如何使用 tshark/wireshark 显示 pcap 的每个数据包的 flowid 和帧号
【发布时间】:2012-10-10 19:34:55
【问题描述】:

tshark 中是否有流 id 的概念?当我搜索过滤器时,我发现 tcp.stream 存在,但它与 udp 的等价物,即 udp.stream 不存在。当我打开一个 pcap 时,默认情况下它会显示帧号、IP 地址、信息等。在一列中,我还需要每个数据包的流 ID 以及帧号。 tshark 提供这样的支持吗?如果没有,我有什么办法可以做到这一点?

我写了一个程序,我正在读取一个 pcap 文件,一个包一个包,我需要每个包读取的 flowid。如果我使用 tshark 命令作为

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

它会显示数据包编号以及其他一些详细信息,但我希望也显示可以在我的程序中读取的 flowid。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你的意思是你想要一个与 udp 协议的每对 ip/port 关联的数字(flowid)吗?
  • @graphite :我需要 pcap 中每个数据包的 flowid(无论是 upd 还是 tcp)。如果这在 tshark 中是不可能的,我们可以使用 tshark 编写一些脚本,通过它我们可以计算每个数据包的 flowid 或者是否有一些标准库具有计算 flowid 的功能(分配新的 flowid 或现有的 flowid)给定 5流的元组。

标签: wireshark pcap packet-capture wireshark-dissector tshark


【解决方案1】:

wireshark 中的 tcp.stream

以下是wireshrak 为获取tcp.stream 所做的工作。 Tcp解析器有一个全局变量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;
...

给数据包添加 flowid

这是一个用lua编写的wireshark监听器的简单例子。 但是你需要函数 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:

tshark -X lua_script:myconv.lua -z myconv -r in.pcap

【讨论】:

  • 我不知道你想在这里告诉我们什么......我只需要一个 fn 来计算 flowid..请让我知道是否有一些用于此目的的标准库函数跨度>
  • 我只需要 udp 数据包的 udp 流 ID(类似于 tcp.stream 为 tcp 流提供的 ID)。请让我知道该怎么做?谢谢
  • @user1182722,我已经描述了wireshark是如何为tcp做的,希望能有所帮助。
猜你喜欢
  • 2015-02-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2019-11-03
相关资源
最近更新 更多