tcp数据包重组
reassembly of tcp packet
我正在解析一个包含大量需要解析的 tcp 数据包的文件。问题是它们被分割了,我找不到任何迹象表明它们何时何地这样做。没有标志或任何其他指示,当前数据包的中间可能包含下一个数据包的开头。 tcp 之上的协议是 FIX(用于在线交易),但我希望我的代码能够使用任何协议(或者至少了解它是哪个协议)。
我正在用 C++ 编写代码,不能使用任何其他库。
那么,我如何弄清楚 tcp 之上的协议是什么以及它在何处分段?
据我所知,您的问题是分离 TCP 数据包。要解决它,您可以中继有效载荷的长度 (this answer) 和校验和。如果校验和对于指定长度的数据是正确的,那么你的数据包是正确的,如果不是 - 你需要在前面的部分中寻找数据包的开头或丢弃这部分数据。至少这种方法可以帮助你找到 dada 被分割的点。
为了更准确的回答,最好能看到小部分数据。
但你的主要问题是数据包的分段。为了获得更好的性能,您应该尝试排除此问题(也许将网卡换成 Intel)。
你不能。 TCP/IP 在概念上是一个流,而不是一个消息序列(它最终被实现为一个数据包序列的事实是无关紧要的)。当您将字节序列写入 TCP/IP 流时,该序列将添加到流中;它不被视为应保持其自身身份的消息。消息 begin/end 的概念不会随流一起传输,除非您在自己的协议中自己这样做。
如果您觉得这难以置信,请考虑它对文件的作用:如果您将字节序列写入文件,该序列不会以某种方式成为您以后可以识别和检索的记录。如果你想要那种结构,你必须自己添加它。 TCP/IP.
也是如此
用于实现 TCP/IP 的传输数据包与您在 API 调用中指定的数据块无关;它们只是实现 TCP/IP 流的一种方式。对于某些用例,可能会出现映射,但这是偶然的。
将 TCP/IP 流拆分回单独的消息的唯一方法是在 TCP/IP 之上使用协议 运行 的知识。在您的情况下,这是 FIX。我假设你知道它是如何工作的;您可以使用该知识将 FIX 数据正确拆分回其原始消息。无法创建通用 TCP/IP 消息拆分器。
我正在解析一个包含大量需要解析的 tcp 数据包的文件。问题是它们被分割了,我找不到任何迹象表明它们何时何地这样做。没有标志或任何其他指示,当前数据包的中间可能包含下一个数据包的开头。 tcp 之上的协议是 FIX(用于在线交易),但我希望我的代码能够使用任何协议(或者至少了解它是哪个协议)。 我正在用 C++ 编写代码,不能使用任何其他库。 那么,我如何弄清楚 tcp 之上的协议是什么以及它在何处分段?
据我所知,您的问题是分离 TCP 数据包。要解决它,您可以中继有效载荷的长度 (this answer) 和校验和。如果校验和对于指定长度的数据是正确的,那么你的数据包是正确的,如果不是 - 你需要在前面的部分中寻找数据包的开头或丢弃这部分数据。至少这种方法可以帮助你找到 dada 被分割的点。
为了更准确的回答,最好能看到小部分数据。
但你的主要问题是数据包的分段。为了获得更好的性能,您应该尝试排除此问题(也许将网卡换成 Intel)。
你不能。 TCP/IP 在概念上是一个流,而不是一个消息序列(它最终被实现为一个数据包序列的事实是无关紧要的)。当您将字节序列写入 TCP/IP 流时,该序列将添加到流中;它不被视为应保持其自身身份的消息。消息 begin/end 的概念不会随流一起传输,除非您在自己的协议中自己这样做。
如果您觉得这难以置信,请考虑它对文件的作用:如果您将字节序列写入文件,该序列不会以某种方式成为您以后可以识别和检索的记录。如果你想要那种结构,你必须自己添加它。 TCP/IP.
也是如此用于实现 TCP/IP 的传输数据包与您在 API 调用中指定的数据块无关;它们只是实现 TCP/IP 流的一种方式。对于某些用例,可能会出现映射,但这是偶然的。
将 TCP/IP 流拆分回单独的消息的唯一方法是在 TCP/IP 之上使用协议 运行 的知识。在您的情况下,这是 FIX。我假设你知道它是如何工作的;您可以使用该知识将 FIX 数据正确拆分回其原始消息。无法创建通用 TCP/IP 消息拆分器。