tcp数据包的重新组装

reassembly of tcp packet

本文关键字:新组装 数据包 tcp      更新时间:2023-10-16

我正在解析一个文件,其中包含许多需要解析的tcp数据包。问题是它们被分割了,我找不到任何指示它们何时何地进行分割。没有标志或任何其他指示,表明当前数据包的中间可能包含下一个数据包的开头。tcp上面的协议是FIX(用于在线交易),但我希望我的代码能够与任何协议一起工作(或者至少了解它是哪个协议)。我正在用C++编写代码,不能使用任何其他库。那么,我该如何弄清楚tcp之上的协议是什么,以及它在哪里被分割?

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

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

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

将TCP/IP流拆分回单独消息的唯一方法是使用运行在TCP/IP之上的协议知识。在您的情况下,这是FIX。我想你知道这是怎么回事;您可以使用这些知识将FIX数据正确地拆分回其原始消息。无法制作通用TCP/IP消息拆分器。

正如我所看到的,您的问题是分离TCP数据包。要解决这个问题,您可以中继有效载荷的长度(这个答案)和校验和。如果具有指定长度的数据的校验和是正确的,则数据包是正确的;如果不是,则需要在数据包的前一部分中查找数据包的开头,或者丢弃这部分数据。至少这种方法可以帮助你们找到dada被分割的地方。

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

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