目标
我正在努力实现以下目标:
-
捕获包含FIX protocol中对话的网络流量
-
将来自网络流量的各个FIX消息提取为"nice"格式,例如, CSV
-
对导出的"nice"格式数据进行一些数据分析
我通过以下方式实现了:
-
使用pcap捕获网络流量
-
使用tshark将相关数据打印为CSV
-
使用Python(pandas)来分析数据
问题
问题是一些捕获的TCP数据包包含多个FIX消息,这意味着当我使用tshark导出到CSV时,我没有得到每行的FIX消息 . 这使得消费CSV变得困难 .
这是我用来提取相关FIX字段的tshark命令行,因为CSV是:
tshark -r dump.pcap \
-R \'(fix.MsgType[0]=="G" or fix.MsgType[0]=="D" or fix.MsgType[0]=="8" or \ fix.MsgType[0]=="F") and fix.ClOrdID != "0"\' \
-Tfields -Eseparator=, -Eoccurrence=l -e frame.time_relative \
-e fix.MsgType -e fix.SenderCompID \
-e fix.SenderSubID -e fix.Symbol -e fix.Side \
-e fix.Price -e fix.OrderQty -e fix.ClOrdID \
-e fix.OrderID -e fix.OrdStatus'
请注意,我正在使用“-Eoccurrence = l”来获取在数据包中出现多个字段的情况下最后一次出现的命名字段 . 这不是一个可接受的解决方案,因为当数据包中有多个FIX消息时,信息将被丢弃 .
这是我期望在导出的CSV文件中的每一行(来自一个FIX消息的字段)中看到的内容:
16.508949000,D,XXX,XXX,YTZ2,2,97480,34,646427,,
这是我在TCP数据包中有多个FIX消息(本例中为三个)并且使用命令行标志“-Eoccurrence = a”时看到的内容:
16.515886000,F,F,G,XXX,XXX,XXX,XXX,XXX,XXX,XTZ2,2,97015,22,646429,646430,646431,323180,323175,301151,
问题
有没有办法(不一定使用tshark)从pcap文件中提取每个特定于协议的消息?
1 回答
Better Solution
使用
tcpflow
可以在不离开命令行的情况下正确完成此操作 .我目前的方法是使用类似的东西:
tcpflow
确保遵循TCP流,因此不会丢失FIX消息(在单个TCP数据包包含多于1个FIX消息的情况下) .-C
写入控制台,-B
确保二进制输出 . 这种方法与Wireshark中的TCP流不同 .保留了FIX分隔符,这意味着我可以对输出进行一些方便的操作,例如
提取所有执行报告 . 注意grep的
-P
参数允许非常强大的perl正则表达式 .A (Previous) Solution
我正在使用 Scapy (另见Scapy Documentation,The Very Unofficial Dummies Guide to Scapy)读取pcap文件并从数据包中提取每个单独的FIX消息 .
以下是我正在使用的代码的基础:
我仍然希望能够从网络数据包的“帧”层获取其他信息,特别是相对(或参考)时间 . 不幸的是,Scapy数据包对象似乎没有 - 它的最顶层是Ether层,如下所示 .