tshark中是否有流动ID的概念?当我搜索过滤器时,我发现存在 tcp.St_s>存在,但其等效于UDP,即 udp.Stream 不存在。当我打开PCAP时,默认情况下,它显示帧号,IP地址,信息等。在一个列中,我还需要每个数据包的流ID与帧号。TSHARK会提供这样的支持吗?如果没有,我有什么办法可以做到吗?
我编写了一个程序,我正在阅读一个PCAP文件,数据包,并且我需要每个数据包读取的FlowID。如果我使用tshark命令为
./tshark -r in.pcap -z conv,tcp
它与其他一些细节一起显示了数据包号,但是我也希望显示我可以在程序中阅读的flowid。
任何帮助将不胜感激。谢谢。
tcp.Stream in Wireshark
这是Wireshrak为获取TCP.Stream所做的。TCP解剖器具有全局变量guint32 tcp_stream_index;
然后每个与对话关联的数据包。每个对话数据都存储在哈希表中(Wireshark使用可怕的)。他们使用5核作为钥匙。如果他们有新的5核心,他们会发起新的对话,并在那里增加TCP_STREAM_INDEX:
init_tcp_conversation_data(packet_info *pifo)
{
...
tcpd->stream = tcp_stream_index++;
...
}
,它们有hah的方式:
/*
* 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)
和lanch tshark:
tshark -X lua_script:myconv.lua -z myconv -r in.pcap