【发布时间】:2012-11-28 09:50:03
【问题描述】:
目标
我正在努力实现以下目标:
- 捕获包含FIX protocol 中的对话的网络流量
- 从网络流量中提取单个 FIX 消息为“不错”的格式,例如CSV
- 对导出的“nice”格式数据做一些数据分析
我通过以下方式实现了这一目标:
- 使用 pcap 捕获网络流量
- 使用 tshark 以 CSV 格式打印相关数据
- 使用 Python(熊猫)分析数据
问题
问题是一些捕获的 TCP 数据包包含多个 FIX 消息,这意味着当我使用 tshark 导出到 CSV 时,我没有收到每行的 FIX 消息。这使得使用 CSV 变得困难。
这是我用来将相关 FIX 字段提取为 CSV 的 tshark 命令行:
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 文件中提取每个单独的、特定于协议的消息?
【问题讨论】:
-
一种意见,FIX 消息中的最后一个字段保证是校验和(10=某个数字)。你为什么不在这个标签上打破你的消息边界,同时读/写 FIX 消息。由于 FIX 消息的长度不同,TCP 数据包肯定会有所不同,因此您不能设置固定的数据包大小来读取 FIX 消息。
-
在这种情况下,我无法控制将 FIX 消息写入网络,因此无法强制每个数据包发送一条 FIX 消息。我也不直接从网络上读取 FIX。我查看 FIX 的原因是为了进行性能分析。我最终使用“|8=FIX”来指示 TCP 有效负载中第二个或更晚的 FIX 消息的开始(请参阅下面的解决方案)。
标签: pcap fix-protocol tshark