8

嗨对不起,如果这是一个愚蠢的问题(我刚开始学习网络编程),但我一直在谷歌上寻找文件/数据如何划分为数据包。我到处读到,文件以某种方式分解为数据包,在它们通过 OSI 模型时应用了页眉/页脚,并通过接收方基本上相反并删除标题的线路发送。

我的问题是文件/数据究竟是如何分解成数据包的,以及它们是如何在另一端重新组装的?

重新组装的任何事情如何知道最后一个数据包何时到达等等?

是否可以重新组装从另一台机器捕获的数据包?如果是这样怎么办?

(另外,如果它意味着什么,我最感兴趣的是它如何处理 TCP 类型的数据包)

我还通过WireShark从计算机上的应用程序中捕获了一些数据包,它们被标记为TCP协议,我想做的是将它们重新组合成原始数据,但是你怎么知道哪些数据包属于哪一组数据?

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

4

3 回答 3

4

我的问题是文件/数据究竟是如何分解成数据包的

通过网络发送的不一定是文件。在它文件的情况下,有几种不同的协议可以发送文件,问题的答案取决于协议。

对于 FTP 和 HTTP,文件的全部内容可能作为单个数据流通过 TCP 发送(在 HTTP 的情况下,在标头之前,在 FTP 的情况下,只是原始的,通过连接)。

对于 TCP,有一个由客户端和服务器协商的“最大段大小”,基于服务器和客户端之间的各种网络上的最大数据包大小等因素,并且文件数据以大小为的块顺序发送受最大数据包大小以及 IP 和 TCP 标头大小的限制。

对于 SMB、NFS 和 AFP 等远程文件访问协议,通过网络传输的是“文件读取”和“文件写入”请求;对“文件读取”请求的回复包括一些回复头,如果读取成功,则读取请求请求的文件数据块,“文件写入”请求包括一些请求头和文件数据块被写。那些不是保证是整个文件,按顺序,但是如果读取或写入文件的程序是按顺序读取或写入整个文件,则整个文件的数据都是可用的。数据包大小将取决于读取回复/写入请求标头的大小以及正在使用的读取或写入大小;根据 TCP“最大段大小”以及 IP 和 TCP 标头的大小,这些数据包可能会被分成多个 TCP 段。

我的问题是文件/数据究竟是如何分解成数据包的

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

对于 HTTP,当传输数据的 TCP 连接端关闭时,数据的接收者知道没有更多数据,或者,如果连接是“持久的”(即,对于更多请求和回复),当“Content-Size:”标头指定的数据量在数据之前发送时已经传输(或其他类似机制,例如分块编码的“最后一个块”指示)。

对于文件访问协议,没有真正的“我们处于数据末尾”的指示;对于 SMB、AFP 和 NFSv4,最接近的近似值是“文件关闭”操作。

是否可以重新组装从另一台机器捕获的数据包?如果是这样怎么办?

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

于 2013-08-21T07:23:51.577 回答
1

我的问题是文件/数据究竟是如何分解成数据包的,以及它们是如何在另一端重新组装的?

它们基本上只是被切碎了。每个互联网数据包(带有标头信息添加)只能容纳几百字节的实际数据。

重新组装的任何事情如何知道最后一个数据包何时到达等等?

对于传输,数据包被编号,因此接收进程知道如何将它们放在一起。如果它丢失了一个数据包,它可以请求重新发送。

是否可以重新组装从另一台机器捕获的数据包?如果是这样怎么办?

我不明白这个问题。除非您是中间人,否则您将如何获得这些数据包?

这些答案适用于 TCP 数据包。

于 2013-08-20T21:26:11.100 回答
0

首先确定您要传输的尺寸。

然后为每次传输放置页眉、数据和页脚。

请参阅缓冲区长度和数据数组应该被数据包的数量整除而不给出分数。

这里的header应该包含帧号、时间戳、包号

有效载荷数据

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

发送前准备数据片段

于 2017-06-12T11:57:59.063 回答