目标
我正在努力实现以下目标:
- 捕获包含FIX 协议中的对话的网络流量
- 将网络流量中的单个 FIX 消息提取为“好”格式,例如 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 文件中提取每个单独的协议特定消息?