如何在单个 TCP 数据包中从不同文件中分离数据?

Posted

技术标签:

【中文标题】如何在单个 TCP 数据包中从不同文件中分离数据?【英文标题】:How to separate data from different files in a single TCP packet? 【发布时间】:2021-03-01 06:53:36 【问题描述】:

假设我已经传输了 2 个文件 A.binB.bin 的数据,因为一个 TCP 数据包可以包含来自多个文件的数据,从随机位置开始, wireshark抓包后,如何识别包的哪一部分数据属于哪个文件(假设我没有原始文件A.bin和B.bin)?

【问题讨论】:

仅供参考:如果您只是尝试提取 2 个文件,A.binB.bin,并且这些文件是使用HTTP,那么您应该能够使用 Wireshark 的 File -> Export Objects -> HTTP... 功能提取它们。 【参考方案1】:

TCP 是一个字节流。它没有固有的消息语义,即既不在数据包边界也不在数据包内部。任何消息语义都需要由应用层协议完成,或者必须以某种方式固有在传输的数据中。

如果没有特定的应用程序协议以某种方式描述 A.bin 的结束位置和 B.bin 的开始位置,并且如果这些信息不是这些文件中固有的(例如具有特定的文件格式),那么就不可能分离这些文件。但是假设这是一个真实世界的应用程序,其中接收者知道如何分离文件,那么您必须将接收者拥有的相同知识应用于您的数据包捕获。但是没有通用的魔术方法。

【讨论】:

以上是关于如何在单个 TCP 数据包中从不同文件中分离数据?的主要内容,如果未能解决你的问题,请参考以下文章

对于可以从不同来源接收数据的单个对象,我需要啥设计模式?

在 Core Data 中分离单个对象模型的组件

从不同文件发送数据的简单 perl 程序

在 Cocoa 中,从不在应用程序包中的本地文件获取二进制数据的正确方法是啥?

如何列出脚本中分离的进程?

我应该如何在我的数据库设计中分离这些数据