重组tcp包

时间:2016-07-25 07:39:56

标签: c++ tcp packet

我正在解析一个包含大量tcp数据包的文件,我需要解析它。问题是它们被分割,我无法在何时何地找到任何指示。没有标志或其他任何指示,当前数据包的中间可能包含下一个数据包的开头。上面的协议tcp是FIX(用于在线交易),但我希望我的代码能够使用任何协议(或至少了解哪个协议是它)。 我用C ++编写代码并且不能使用任何其他库。 那么,我如何弄清楚tcp上方的协议是什么以及它被分割的位置?

2 个答案:

答案 0 :(得分:3)

你不能。 TCP / IP在概念上是流,而不是消息序列(事实上它最终实现为一系列数据包是无关紧要的)。当您将一个字节序列写入TCP / IP流时,该序列将添加到流中;它不被视为应该保持自己身份的信息。消息开始/结束的概念不会与流一起传输,除非您自己使用自己的协议。

如果您觉得难以置信,请考虑它对文件的作用:如果您将一个字节序列写入文件,该序列不会以某种方式成为您以后可以识别和检索的记录。如果你想要那种结构,你必须自己添加它。 TCP / IP也是如此。

用于实现TCP / IP的传输数据包与您使用API​​调用指定的数据块无关;它们只是实现TCP / IP流的一种方式。对于某些用例,可能会出现映射,但这是偶然的。

将TCP / IP流拆分回单独消息的唯一方法是使用在TCP / IP之上运行的协议的知识。在你的情况下,这是FIX。我假设你知道它是如何工作的;您可以使用该知识将FIX数据正确地拆分回原始消息中。无法建立通用的TCP / IP消息分离器。

答案 1 :(得分:-2)

我可以看到你的问题是分离TCP数据包。要解决它,您可以在有效负载(this answer)和校验和的长度上进行中继。如果校验和对于指定长度的数据是正确的,那么数据包是正确的,如果没有 - 您需要在前一部分中寻找数据包的开始或丢弃这部分数据。至少这种方法可以帮助你找到dada被分割的点。

要获得更精确的答案,最好只查看一小部分数据。

但主要的问题是数据包的细分。为了获得更好的性能,您应该尝试排除此问题(可能将网卡更改为英特尔)。