对不起,如果这是一个愚蠢的问题(我刚刚开始学习网络编程),但我一直在寻找关于如何将文件/数据分成数据包的谷歌。我到处都读到,文件被分解成数据包,因为它们通过OSI模型时会应用页眉/页脚,并通过线路发送,接收者基本上反过来并删除标题。
我的问题是文件/数据究竟是如何分解成数据包的,以及它们如何在另一端重组?
进行重组的任何事情如何知道最后一批数据何时到达等?
是否可以重新组合从另一台机器捕获的数据包?如果是这样的话?
(如果这意味着我最感兴趣的是这对TCP类型数据包的工作方式)
我也有一些从我的计算机上的应用程序通过WireShark捕获的数据包,它们被标记为TCP协议,我想要做的是将它们重新组装回原始数据,但是如何判断哪些数据包属于哪个数据包数据集?
非常感谢任何对资源的指示,谢谢!
答案 0 :(得分:2)
我的问题是文件/数据究竟是如何分解成数据包的
通过网络发送的内容不一定是文件。在是文件的情况下,有几种不同的协议可以发送文件,问题的答案取决于协议。
对于FTP和HTTP,文件的整个内容可能通过TCP作为单个数据流发送(在HTTP的情况下前面是标题,在FTP的情况下只是原始的,通过连接)。
对于TCP,客户端和服务器协商的“最大段大小”基于诸如服务器和客户端之间的各种网络上的最大数据包大小等因素,并且文件数据按顺序以块的形式发送其大小受最大数据包大小和IP和TCP标头大小的限制。
对于远程文件访问协议,例如SMB,NFS和AFP,通过网络传输的是“文件读取”和“文件写入”请求;对“文件读取”请求的回复包括一些回复标题,如果读取成功,则读取请求所要求的文件数据块和“文件写入”请求包括一些请求标题和文件数据块。正在写那些不按顺序保证是整个文件,但如果读取或写入文件的程序按顺序读取或写入整个文件,则整个文件的数据将可用。数据包大小取决于读取回复/写入请求标头的大小以及所使用的读取或写入大小;根据TCP“最大段大小”以及IP和TCP报头的大小,这些数据包可能会被分成多个TCP段。
我的问题是文件/数据究竟是如何分解成数据包的
对于FTP,当数据传输的TCP连接端关闭时,数据的接收者知道没有更多的数据。
对于HTTP,如果连接是“持久的”,则当数据传输的TCP连接端关闭或时,数据的接收者知道没有更多数据。 (即,在数据之前发送的“Content-Size:”标题指定的数据量已被传输(或其他类似机制,例如“最后一块”),它会保持打开以进行更多请求和回复) chunked encoding)的指示。
对于文件访问协议,没有真正的“我们在数据末尾”指示;对于SMB,AFP和NFSv4,最接近的近似值是“文件关闭”操作。
是否可以重新组合从另一台机器捕获的数据包?如果是这样的话?
这取决于协议,但是,对于HTTP和SMB,如果捕获已被读入Wireshark(并且所有文件数据都在捕获中!),则可以使用“导出对象”菜单,以及某些协议,您也可以使用tcpflow。
答案 1 :(得分:1)
我的问题是文件/数据究竟是如何分解成数据包的,以及它们如何在另一端重组?
他们基本上只是被砍掉了。每个互联网数据包(带有标题信息添加)只能容纳几百个字节的实际数据。
重组的任何事情如何知道数据的最后一个数据包何时到达等等?
对于传输,数据包已编号,因此接收进程知道如何将它们组合在一起。如果它丢失了一个数据包,它可以请求重新发送。
是否可以重新组合从另一台机器捕获的数据包?如果是这样的话?
我不明白这个问题。除非你是中间人,否则你会如何获得这些数据包呢?
这些答案适用于TCP数据包。
答案 2 :(得分:0)
首先确定要传输的大小。
然后为每次传输添加标题,数据和页脚。
请参阅缓冲区长度,数据数组应该可以被数据包整除,而不会给出分数。
此处标题应包含帧编号,时间戳,包编号
有效载荷数据
页脚---您的公司信息。
在发送之前准备数据片段