我的问题是文件/数据如何被分成数据包的?
在网络上传输的不一定是一个文件。如果是文件,则有几种不同的协议可以发送文件,答案取决于使用的协议。
对于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。