我的问题是文件/数据究竟是如何分解成数据包的
通过网络发送的不一定是文件。在它是文件的情况下,有几种不同的协议可以发送文件,问题的答案取决于协议。
对于 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。