【问题标题】:how to reassemble tcp segment?如何重新组装tcp段?
【发布时间】:2010-02-13 23:04:51
【问题描述】:

我现在正在使用 winpcap 开发一个项目..因为我知道被嗅探的数据包通常是碎片数据包。

如何重新组装这个 TCP 段?..任何想法、建议或教程可用?..

我认为这是我可以查看 HTTP 标头的唯一方法...

谢谢!..

【问题讨论】:

    标签: http visual-c++ networking tcp winpcap


    【解决方案1】:

    tcp 是一种字节流协议。 您的 http 应用程序发送的字节序列被封装在 tcp 数据段中,并且在将数据传送到另一端的应用程序之前重新创建字节流。 由于您正在使用 winpcap 访问 tcp 数据段,因此您需要转到该段的数据部分。 tcp 的标头具有 20 字节的固定长度 + 一个您需要使用 winpcap api 确定的可选部分。

    tcp 段中数据部分的长度是通过减去 tcp 头长度(从 tcp 段中的字段获得)和 ip 头长度(从封装 tcp 段的 ip 数据报中的字段中获得)来确定的总长度(从 ip 数据报中的另一个字段获得)。

    所以现在您有了总段长度和段内数据部分的长度。所以你知道http请求数据开始的偏移量。

    偏移量是

    total length-length of data part
    or
    length of ip-header + length of tcp header
    

    我没有用过winpcap。因此您必须了解如何使用 api 获取这些字段。

    ip 数据报也可能进一步碎片化,但我希望您只提供使用此 api 重新组装的数据报。你可以走了!

    【讨论】:

      【解决方案2】:

      没有 TCP 片段这样的东西。 IP 协议有分片。 TCP 是一种流协议。您可以按照双方的序列号将流组装成预期的顺序。每个 TCP 数据包都进入 IP 级别,并且可以在那里进行分段。您可以通过收集所有分片并遵循标头的分片偏移量来组装每个数据包。
      您需要的所有信息都在标题中。维基百科文章在解释每个字段是什么方面非常有用

      http://en.wikipedia.org/wiki/TCP_header#Packet_structure
      http://en.wikipedia.org/wiki/IPv4#Header

      【讨论】:

        【解决方案3】:

        PcapPlusPlus 为所有主要操作系统(包括 Windows)提供了开箱即用的功能。请查看TcpReassembly 示例以查看工作代码和 API 文档以了解如何使用 TCP 重组功能

        【讨论】:

          【解决方案4】:

          根据您尝试被动重组的流量,您可能会遇到一些 TCP 混淆技术,这些技术旨在迷惑试图完全按照您正在尝试做的事情的人。查看this paper 了解不同的操作系统重组行为。

          【讨论】:

            【解决方案5】:

            libtins 提供类以非常高级的方式执行TCP stream reassembly,因此您不必担心 TCP 内部。

            【讨论】:

              猜你喜欢
              • 2011-05-27
              • 2010-10-10
              • 2014-08-17
              • 2015-07-05
              • 1970-01-01
              • 2019-04-07
              • 2012-10-19
              • 2015-07-23
              • 1970-01-01
              相关资源
              最近更新 更多