tshark中是否有流ID的概念?当我搜索过滤器时,我发现 tcp.stream 存在,但它与udp的等价物,即 udp.stream 并不存在。当我打开pcap时,默认显示帧号,IP地址,信息等。在一列中,我还需要每个数据包的流ID以及帧号。 tshark会提供这样的支持吗?如果没有,有什么办法可以做到这一点吗?
我写了一个程序,我正在读取一个pcap文件,逐个数据包,我需要每个数据包读取的flowid。如果我使用tshark命令
./tshark -r in.pcap -z conv,tcp
它会显示数据包编号以及其他一些细节,但我希望还能显示我可以在我的程序中读取的flowid。
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
以下是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;
...
这是一个用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