数据是如何分成数据包的?

8

抱歉,如果这是一个愚蠢的问题请见谅(我刚开始学习网络编程),但是我一直在Google上搜索关于如何将文件/数据划分为数据包的相关信息。我在各个地方都看到说文件被分成数据包并通过OSI模型传输时会应用标头/页脚,然后发送到接收端,并且接收端会反向删除标头。

我的问题是,文件/数据是如何被拆分成数据包的,它们如何在另一端重新组装?

在重新组装过程中,如何知道数据的最后一个数据包何时到达等信息?

是否可能重新组装从另一台机器捕获的数据包?如果可以,它该如何进行?

(如果有意义的话)我主要想知道TCP类型数据包的工作原理。

我还使用WireShark从计算机上的应用程序捕获了一些标记为TCP协议的数据包,我想重新将它们组装成原始数据,但是怎样才能确定哪些数据包属于哪个数据集?

非常感谢任何资源指针,谢谢!

3个回答

5
我的问题是文件/数据如何被分成数据包的?
在网络上传输的不一定是一个文件。如果是文件,则有几种不同的协议可以发送文件,答案取决于使用的协议。
对于FTP和HTTP,整个文件的内容可能作为单个数据流通过TCP发送(HTTP的情况下带有头信息,在FTP的情况下只是原始的连接)。
对于TCP,客户端和服务器基于各个网络上的最大数据包大小等因素协商了“最大段大小”,文件数据按顺序分块发送,其大小受到最大数据包大小和IP和TCP头大小的限制。
对于远程文件访问协议,如SMB、NFS和AFP,通过网络传输的是“文件读取”和“文件写入”请求;对“文件读取”请求的回复包括一些回复头信息,如果读取成功,则包括所请求的文件数据块,而“文件写入”请求则包括一些请求头信息和正在写入的文件数据块。这些块不保证是整个文件,也不保证按顺序,但如果读取或写入文件的程序按顺序读取或写入整个文件,则整个文件的数据将可用。分组大小取决于读取回复/写入请求头的大小以及所使用的读取或写入大小;这些数据包可能会根据TCP“最大段大小”和IP和TCP头的大小被分成多个TCP段。

我的问题是文件/数据如何被分成数据包

对于FTP,接收数据的一方知道当传输数据的TCP连接关闭时,没有更多的数据了。

对于HTTP,数据的接收方知道当传输数据的TCP连接一侧关闭或者连接是“持久”的(即保持开放状态以获取更多请求和回复),在发送数据之前指定的“Content-Size:”头所指定的数据量已经传输完成时(或其他类似机制,例如chunked encoding的“last chunk”指示)就没有更多数据了。
对于文件访问协议,没有真正的“我们到达数据结尾”的指示;对于SMB、AFP和NFSv4,最接近的近似值是“文件关闭”操作。

是否有可能重新组装从另一台计算机捕获的数据包?如果可以,如何操作?

这取决于协议,但是对于HTTP和SMB,如果捕获数据已经被读入Wireshark(并且所有文件数据都在捕获中!),您可以使用“导出对象”菜单,并且对于某些协议,您也可以使用tcpflow

我还有一些通过WireShark从我的计算机上捕获的应用程序数据包,它们被标记为TCP协议。我想要做的是将它们重新组装成原始数据,但是如何确定哪些数据包属于哪个数据集呢?(编辑了上面的问题) - Edgepad
我还有一些通过WireShark从我的电脑上捕获的应用程序数据包,它们被标记为TCP协议。这意味着Wireshark无法理解该协议。如果不理解该协议,就无法确定数据包中的任何内容含义,也无法确定它们是否在传输文件,更不用说它们是否在传输文件或其他数据块,以及数据包中哪些数据属于哪个数据集。 - user862787
如果是这样,那么为什么数据在Wireshark中(以ASCII形式)是半可读的?当您在Wireshark中右键单击数据包时,“跟随TCP流”选项到底是做什么的? - Edgepad
那么为什么在Wireshark中数据是半可读的(以ASCII形式)?因为这不需要任何理解 - 请注意,您说过“可读性”;十六进制/ ASCII转储窗格中还有许多其他内容,这些内容不是数据的一部分。 - user862787
“当您在Wireshark中右键单击数据包时,“跟随TCP流”选项到底是做什么的?”它将原始字节(通过TCP传输)放入窗口,无论这些字节是数据还是消息头。 - user862787
显示剩余2条评论

1
我的问题是文件/数据如何被分成数据包,并在另一端重新组装?
它们基本上只是被切割。每个互联网数据包(带有头信息)只能容纳几百字节的实际数据。
那些执行重新组装的程序如何知道数据的最后一个数据包何时到达等等?
对于传输,数据包会被编号,因此接收进程知道如何将它们组合在一起。如果丢失了一个数据包,可以请求重新发送。
是否可能重新组装从另一台机器捕获的数据包?如果可以,如何操作?
我不明白这个问题。除非你是中间人,否则你怎么会得到这些数据包呢?
这些答案适用于TCP数据包。

对于最后一个问题,我的意思是如果我使用类似于libpcap的东西捕获数据包,是否有可能将它们重新组装成原始文件?是否有一种统一的处理所有TCP数据包的过程来实现这一点? - Edgepad
是的,这是可能的。只要你都捕捉到了它们。 - Jiminion

0

首先确定您要传输的大小。

然后为每个传输放置头部、数据和尾部。

请注意,缓冲区长度和数据数组应该能够被数据包数量整除,不留下任何小数。

在这里,头部应包含帧编号、时间戳和数据包编号。

有效载荷数据

页脚---您公司的信息。

在发送之前准备好数据片段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接