tcp数据包重组

Posted

技术标签:

【中文标题】tcp数据包重组【英文标题】:reassembly of tcp packet 【发布时间】:2016-11-28 11:07:36 【问题描述】:

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

【问题讨论】:

要重组 TCP 流,首先你必须学会​​如何重组 IP 片段。请参阅 RFC 815。 不清楚你在问什么。这些数据是如何获取的? @Alnitak 我怀疑他在这里捕获原始数据。 RFC 815 发生在网络堆栈内部,而不是在用户级别之外。 @H.Guijt 除非你正在阅读 pcap 文件......(是的,目前还不清楚这些文件的来源) @Alnitak 他可能也在他的示波器上查看电信号,但缺乏更多信息我认为假设普通用户级 API 是合理的...... 【参考方案1】:

正如我所见,您的问题是分离 TCP 数据包。为了解决这个问题,您可以传递有效载荷长度 (this answer) 和校验和。如果校验和对于指定长度的数据是正确的,那么您的数据包是正确的,如果不是 - 您需要在前一部分中寻找数据包的开始或丢弃这部分数据。至少这种方法可以帮助您找到数据被分割的点。

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

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

【讨论】:

欢迎来到 Stack Overflow!这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您earn足够reputation,您就可以在任何帖子上comment。如果您有一个相关但不同的问题,ask a new question 参考这个问题,如果它有助于提供上下文。 分段是TCP/IP协议的一部分,与所涉及的网卡品牌无关。【参考方案2】:

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

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

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

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

【讨论】:

s/packets/message/g,拜托 - 数据包是在第 2 层和第 3 层协议中通过线路传输的:协议消息 -> TCP 流 -> TCP 段 -> IP 数据包 -> 以太网数据包 我已在适当的地方将数据包更改为消息,但由于最初的问题已经询问了有关数据包的问题,​​因此我不确定它是否因此变得更加清晰。

以上是关于tcp数据包重组的主要内容,如果未能解决你的问题,请参考以下文章

Wireshark数据包分析之FTP协议包解读

5.2、tcp三次握手详析,telnet,wireshark示范

TCP流嗅探和连接跟踪工具tcpick

TCP/IP名词解释

Python渗透测试工具有哪些

网络基础tcp/ip协议四