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

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

【问题讨论】:

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

标签: c++ tcp packet


【解决方案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 数据包 -> 以太网数据包
  • 我已在适当的地方将数据包更改为消息,但由于最初的问题已经询问了有关数据包的问题,​​因此我不确定它是否因此变得更加清晰。
猜你喜欢
  • 2011-07-10
  • 2015-07-23
  • 2020-06-10
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2010-09-13
相关资源
最近更新 更多