如何重新组装TCP段?

时间:2010-02-13 23:04:52

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

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

如何重新组合这个TCP片段?任何想法,建议或教程可用吗?..

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

谢谢!..

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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 datagrams可能会进一步碎片化,但我希望你只使用这个api提供重新组装的数据报。你很高兴!

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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